diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 99fcca8..c8723d3 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -139,23 +139,21 @@ jobs: name: lo-linux-${{ matrix.platform }} build-windows: - if: ${{ false }} # disable +# if: ${{ false }} # disable name: windows - runs-on: windows-2022 + runs-on: windows-latest strategy: fail-fast: false matrix: - platform: [x64,arm64] + platform: [x64] steps: - uses: actions/checkout@v3 - name: Install MSVC/MCBuild (Windows) uses: microsoft/setup-msbuild@v1.0.2 - name: compile + shell: cmd run: | - make BINDINGS= ARCH=${{ matrix.platform }} lo.exe - - name: check - run: | - make check + call ${{ github.workspace}}\build.cmd - name: upload artifact uses: actions/upload-artifact@v4 with: diff --git a/.gitignore b/.gitignore index 369f570..355b7bc 100644 --- a/.gitignore +++ b/.gitignore @@ -17,7 +17,9 @@ notes.md lib/inflate/em_inflate.c lib/inflate/em_inflate.h lib/**/*.cc +!lib/win/win.cc !lib/core/core.cc +!lib/core2/core.cc !lib/curl/curl.cc !lib/inflate/inflate.cc !lib/mach/mach.cc @@ -32,4 +34,5 @@ node_modules lib/lines/linenoise.h lib/lines/linenoise.c zero -dist \ No newline at end of file +dist +*.pdb \ No newline at end of file diff --git a/Makefile b/Makefile index 1dcb9c8..7439f24 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ CCARGS=-fPIC -std=c++20 -c -fno-omit-frame-pointer -fno-rtti -fno-exceptions -fv CARGS=-fPIC -c -fno-omit-frame-pointer -fvisibility=hidden WARN=-Werror -Wpedantic -Wall -Wextra -Wno-unused-parameter -Wno-error=unknown-warning-option OPT=-O3 -VERSION=0.0.23-pre +VERSION=0.0.24-pre V8_VERSION=14.3 RUNTIME=lo LO_HOME=$(shell pwd) diff --git a/build.cmd b/build.cmd new file mode 100644 index 0000000..fa4ad9b --- /dev/null +++ b/build.cmd @@ -0,0 +1,53 @@ +@echo off +set VERSION=0.0.24-pre +set V8=14.3 +set RUNTIME=lo +set V8_OPTS=-DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS +set OPTS=-std=c++20 -fomit-frame-pointer -fno-rtti -fno-exceptions -O3 -march=native -mtune=native +set WARN=-Werror -Wpedantic -Wall -Wextra -Wno-unused-parameter -Wno-error=unknown-warning-option +set OBJS=lo.o main.o win.o core.o inflate.o lib\inflate\em_inflate.o +set LOPTS=-lwinmm -ldbghelp -lbcrypt +set INCLUDE=-I. -I./v8 -I./v8/include +set BUILTINS=lib/inflate.js lib/gen.js lib/path.js lib/proc.js lib/stringify.js lib/binary.js +if "%WindowsSdkDir%"== "" ( + call "C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Auxiliary\Build\vcvars64.bat" +) +if not exist v8 ( + mkdir v8 + cd v8 + curl -L -O https://github.com/just-js/v8/releases/download/%V8%/include.tar.gz + tar -xvf include.tar.gz + curl -L -O https://github.com/just-js/v8/releases/download/%V8%/libv8_monolith-win-x64.zip + tar -xvf libv8_monolith-win-x64.zip + del /Q *.zip + del /Q *.gz + cd .. +) +if exist lo.exe ( + lo.exe gen --builtins --win main.js %BUILTINS% > builtins.h + lo.exe gen lib\core2\api.js > lib\core2\core.cc + lo.exe gen --header --win core.a win.a inflate.a %BUILTINS% > main_win.h +) +if not exist lib\inflate\em_inflate.o ( + cd lib\inflate + if not exist em_inflate.h ( + curl -s -O https://raw.githubusercontent.com/emmanuel-marty/em_inflate/master/lib/em_inflate.h + ) + if not exist em_inflate.c ( + curl -s -O https://raw.githubusercontent.com/emmanuel-marty/em_inflate/master/lib/em_inflate.c + ) + clang -I. -c -o em_inflate.o -O3 em_inflate.c + cd ..\.. +) +clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% lib/win/win.cc +clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% -Ilib/inflate lib/inflate/inflate.cc +clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% -D_CRT_SECURE_NO_WARNINGS lib/core2/core.cc +clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% -DVERSION=\"%VERSION%\" -DRUNTIME=\"%RUNTIME%\" lo.cc +clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% -DVERSION=\"%VERSION%\" -DRUNTIME=\"%RUNTIME%\" main.cc +REM set CURLP=scratch\curl\curl-8.17.0_6-win64-mingw\ +REM clang++ %OPTS% %INCLUDE% -I%CURLP%include -c %V8_OPTS% -DNOMINMAX lib/curl/curl.cc +REM clang++ v8\v8_monolith.lib %OBJS% curl.o -L %CURLP%lib -l libcurl -l libcurl.dll -l libbrotlicommon -l libbrotlidec -l libcrypto -l libnghttp2 -l libnghttp3 -l libngtcp2 -l libngtcp2_crypto_libressl -l libpsl -l libssh2 -l libz -l libzstd %LOPTS% -o lo.tmp.exe +clang++ v8\v8_monolith.lib %OBJS% %LOPTS% -o %RUNTIME%.tmp.exe +move /Y %RUNTIME%.tmp.exe %RUNTIME%.exe +del *.lib +del *.exp diff --git a/builtins.h b/builtins.h index 236778c..d6dc5af 100644 --- a/builtins.h +++ b/builtins.h @@ -1,6 +1,36 @@ - -const char _binary_main_js_start[] = { -0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x2c, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x2c, 0x20, 0x72, 0x75, 0x6e, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x2c, 0x20, 0x70, 0x75, 0x6d, 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4c, 0x6f, 0x6f, 0x70, 0x2c, 0x20, 0x61, 0x72, 0x63, 0x68, 0x2c, 0x20, 0x6f, 0x73, 0x2c, 0x20, 0x65, 0x78, 0x69, 0x74, 0x2c, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x2c, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x2c, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x2c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x31, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x75, 0x74, 0x66, 0x38, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x75, 0x74, 0x66, 0x38, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0x2c, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0x50, 0x74, 0x72, 0x2c, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0x41, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x77, 0x72, 0x61, 0x70, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x75, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x41, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2c, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0xd, 0xa, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xd, 0xa, 0xd, 0xa, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x54, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x7b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x27, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x27, 0xd, 0xa, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x27, 0x27, 0x29, 0x20, 0x7b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x29, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xd, 0xa, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x29, 0x20, 0x7b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x70, 0x61, 0x73, 0x73, 0x20, 0x61, 0x20, 0x75, 0x33, 0x32, 0x61, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x68, 0x65, 0x72, 0x65, 0x20, 0x73, 0x6f, 0x20, 0x77, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x29, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xd, 0xa, 0x7d, 0xd, 0xa, 0xd, 0xa, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x7b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x27, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x27, 0xd, 0xa, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x75, 0x38, 0x29, 0x20, 0x7b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x70, 0x74, 0x72, 0x28, 0x75, 0x38, 0x29, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x66, 0x38, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x75, 0x38, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x29, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xd, 0xa, 0x7d, 0xd, 0xa, 0xd, 0xa, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x7b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x67, 0x3a, 0x20, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x3e, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x60, 0x24, 0x7b, 0x73, 0x74, 0x72, 0x7d, 0x5c, 0x6e, 0x60, 0x29, 0xd, 0xa, 0x7d, 0xd, 0xa, 0xd, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x74, 0x72, 0x20, 0x28, 0x75, 0x38, 0x29, 0x20, 0x7b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x75, 0x38, 0x29, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x75, 0x38, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x38, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x38, 0xd, 0xa, 0x7d, 0xd, 0xa, 0x20, 0x20, 0xd, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x28, 0x75, 0x33, 0x32, 0x29, 0x20, 0x7b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x33, 0x32, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x32, 0x20, 0x2a, 0x2a, 0x20, 0x33, 0x32, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x33, 0x32, 0x5b, 0x31, 0x5d, 0x29, 0xd, 0xa, 0x7d, 0xd, 0xa, 0xd, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x72, 0x61, 0x70, 0x20, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x66, 0x6e, 0x2c, 0x20, 0x70, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x70, 0x6c, 0x65, 0x6e, 0x29, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, 0x30, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x5f, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x70, 0x24, 0x7b, 0x69, 0x7d, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x2c, 0x20, 0x27, 0x29, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0x3a, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x49, 0x73, 0x53, 0x61, 0x66, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x2d, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x61, 0x66, 0x65, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x27, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x27, 0x2c, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x27, 0x63, 0x61, 0x6c, 0x6c, 0x27, 0x2c, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x24, 0x7b, 0x66, 0x6e, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x20, 0x28, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x7d, 0x29, 0x20, 0x7b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x7d, 0x24, 0x7b, 0x70, 0x6c, 0x65, 0x6e, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x3f, 0x20, 0x27, 0x2c, 0x20, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x29, 0x3b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x76, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x32, 0x20, 0x2a, 0x2a, 0x20, 0x33, 0x32, 0x29, 0x20, 0x2a, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x32, 0x20, 0x2a, 0x2a, 0x20, 0x33, 0x32, 0x29, 0x20, 0x2a, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0x3b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x60, 0x2c, 0x29, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x75, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x29, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x29, 0x20, 0x66, 0x75, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0xd, 0xa, 0x7d, 0xd, 0xa, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0xd, 0xa, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x31, 0x29, 0xd, 0xa, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x42, 0x69, 0x67, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x31, 0x32, 0x29, 0xd, 0xa, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x28, 0x75, 0x73, 0x61, 0x67, 0x65, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x75, 0x73, 0x61, 0x67, 0x65, 0x29, 0xd, 0xa, 0xd, 0xa, 0x72, 0x75, 0x6e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x28, 0x27, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x22, 0x66, 0x6f, 0x6f, 0x22, 0x29, 0x27, 0x2c, 0x20, 0x27, 0x66, 0x6f, 0x6f, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0xd, 0xa, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x38, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x31, 0x30, 0x32, 0x34, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0xd, 0xa, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0xd, 0xa, 0x67, 0x65, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x28, 0x27, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x27, 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x6d, 0x65, 0x74, 0x61, 0x29, 0x29, 0xd, 0xa, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x32, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0xd, 0xa, 0x67, 0x65, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x28, 0x75, 0x38, 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x32, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x6d, 0x65, 0x74, 0x61, 0x32, 0x29, 0x29, 0xd, 0xa, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x75, 0x38, 0x29, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x6c, 0x6f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x28, 0x29, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x28, 0x29, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x27, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x27, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x38, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x6c, 0x6f, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x6c, 0x6f, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x29, 0xd, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x6c, 0x6f, 0x2e, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x28, 0x29, 0x29, 0xd, 0xa, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x28, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x27, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x27, 0x29, 0x29, 0xd, 0xa, 0x72, 0x75, 0x6e, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x28, 0x29, 0xd, 0xa, 0x70, 0x75, 0x6d, 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4c, 0x6f, 0x6f, 0x70, 0x28, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x61, 0x72, 0x63, 0x68, 0x28, 0x29, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x6f, 0x73, 0x28, 0x29, 0x29, 0xd, 0xa, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x27, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x27, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x28, 0x27, 0x63, 0x6f, 0x72, 0x65, 0x27, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x29, 0x29, 0xd, 0xa, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x54, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x28, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x27, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x27, 0x29, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x63, 0x73, 0x74, 0x72, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x63, 0x73, 0x74, 0x72, 0x29, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x6e, 0x6c, 0x65, 0x6e, 0x28, 0x63, 0x73, 0x74, 0x72, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x31, 0x30, 0x32, 0x34, 0x29, 0x29, 0xd, 0xa, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x27, 0x74, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x27, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x66, 0x64, 0x29, 0xd, 0xa, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x75, 0x66, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x34, 0x30, 0x39, 0x36, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x31, 0x30, 0x32, 0x34, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x66, 0x73, 0x74, 0x61, 0x74, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x72, 0x63, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x75, 0x66, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x75, 0x66, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, 0x29 -}; -unsigned int _binary_main_js_len = 3170; - + +const char _binary_main_js_start[] = { +0x2f, 0x2f, 0x20, 0x40, 0x74, 0x73, 0x2d, 0x63, 0x68, 0x65, 0x63, 0x6b, 0xa, 0x2f, 0x2f, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0xa, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x54, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x27, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x27, 0xa, 0xa, 0x20, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x27, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x2f, 0x2a, 0x2a, 0xa, 0x20, 0x20, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x7b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x7d, 0x20, 0x73, 0x72, 0x63, 0xa, 0x20, 0x20, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x7b, 0x54, 0x79, 0x70, 0x65, 0x64, 0x41, 0x72, 0x72, 0x61, 0x79, 0x7d, 0x20, 0x64, 0x65, 0x73, 0x74, 0xa, 0x20, 0x20, 0x2a, 0x2f, 0xa, 0x20, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0x20, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x70, 0x61, 0x73, 0x73, 0x20, 0x61, 0x20, 0x75, 0x33, 0x32, 0x61, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x68, 0x65, 0x72, 0x65, 0x20, 0x73, 0x6f, 0x20, 0x77, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x64, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x70, 0x74, 0x72, 0x28, 0x64, 0x65, 0x73, 0x74, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x27, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x27, 0xa, 0xa, 0x20, 0x20, 0x2f, 0x2a, 0x2a, 0xa, 0x20, 0x20, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x7b, 0x54, 0x79, 0x70, 0x65, 0x64, 0x41, 0x72, 0x72, 0x61, 0x79, 0x7d, 0x20, 0x75, 0x38, 0xa, 0x20, 0x20, 0x2a, 0x2f, 0xa, 0x20, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x28, 0x75, 0x38, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x70, 0x74, 0x72, 0x28, 0x75, 0x38, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x66, 0x38, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x75, 0x38, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xa, 0xa, 0x2f, 0x2a, 0x2a, 0xa, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x7b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x7d, 0x20, 0x65, 0x72, 0x72, 0xa, 0x2a, 0x2f, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x78, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x65, 0x72, 0x72, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x65, 0x72, 0x72, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x3e, 0x20, 0x21, 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x2f, 0x5c, 0x73, 0x2b, 0x61, 0x74, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x5c, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x5c, 0x2e, 0x6a, 0x73, 0x2e, 0x2b, 0x2f, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2a, 0x2a, 0xa, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x7b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x7d, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0xa, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0xa, 0x2a, 0x2f, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x26, 0x26, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x28, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x78, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x28, 0x65, 0x72, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x28, 0x65, 0x72, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x28, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x22, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x22, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x78, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x28, 0x65, 0x72, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x28, 0x65, 0x72, 0x72, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x72, 0x61, 0x70, 0x20, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x66, 0x6e, 0x2c, 0x20, 0x70, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x70, 0x74, 0x72, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x70, 0x6c, 0x65, 0x6e, 0x29, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, 0x30, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x5f, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x70, 0x24, 0x7b, 0x69, 0x7d, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x2c, 0x20, 0x27, 0x29, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0x3a, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x49, 0x73, 0x53, 0x61, 0x66, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x2d, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x61, 0x66, 0x65, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0xa, 0x20, 0x20, 0x20, 0x20, 0x27, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x27, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x27, 0x63, 0x61, 0x6c, 0x6c, 0x27, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x60, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x24, 0x7b, 0x66, 0x6e, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x20, 0x28, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x7d, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x7d, 0x24, 0x7b, 0x70, 0x6c, 0x65, 0x6e, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x3f, 0x20, 0x27, 0x2c, 0x20, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x3b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x32, 0x20, 0x2a, 0x2a, 0x20, 0x33, 0x32, 0x29, 0x20, 0x2a, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0x3b, 0xa, 0x20, 0x20, 0x7d, 0x60, 0x2c, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x75, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x29, 0x20, 0x66, 0x75, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x74, 0x72, 0x20, 0x28, 0x75, 0x38, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x38, 0xa, 0x20, 0x20, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x75, 0x38, 0x29, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x75, 0x38, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x38, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0x3a, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3f, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x38, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x73, 0x74, 0x72, 0x20, 0x28, 0x73, 0x74, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x75, 0x66, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x60, 0x24, 0x7b, 0x73, 0x74, 0x72, 0x7d, 0x5c, 0x30, 0x60, 0x29, 0x29, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x62, 0x75, 0x66, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x62, 0x75, 0x66, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2d, 0x20, 0x31, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x66, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x20, 0x28, 0x75, 0x33, 0x32, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x33, 0x32, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x32, 0x20, 0x2a, 0x2a, 0x20, 0x33, 0x32, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x33, 0x32, 0x5b, 0x31, 0x5d, 0x29, 0x20, 0x20, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x28, 0x76, 0x61, 0x6c, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x61, 0x6c, 0x20, 0x26, 0x20, 0x53, 0x5f, 0x49, 0x46, 0x4d, 0x54, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x61, 0x64, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x64, 0x20, 0x3c, 0x3d, 0x20, 0x32, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x73, 0x74, 0x61, 0x74, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0xa, 0x20, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x66, 0x64, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x28, 0x73, 0x74, 0x61, 0x74, 0x31, 0x36, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x53, 0x5f, 0x49, 0x46, 0x52, 0x45, 0x47, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x28, 0x73, 0x74, 0x61, 0x74, 0x33, 0x32, 0x5b, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x5d, 0x2c, 0x20, 0x53, 0x5f, 0x49, 0x46, 0x52, 0x45, 0x47, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x61, 0x64, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x2c, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x29, 0xa, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x2c, 0x20, 0x60, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x24, 0x7b, 0x70, 0x61, 0x74, 0x68, 0x7d, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x24, 0x7b, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x73, 0x74, 0x61, 0x74, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6d, 0x61, 0x63, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x73, 0x74, 0x5b, 0x31, 0x32, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x74, 0x33, 0x32, 0x5b, 0x35, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x73, 0x74, 0x5b, 0x36, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x66, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x20, 0x2d, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x73, 0x69, 0x7a, 0x65, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x38, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x29, 0x29, 0xa, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2d, 0x20, 0x6f, 0x66, 0x66, 0x29, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x66, 0x66, 0x20, 0x2b, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0xa, 0x20, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x66, 0x64, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x38, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x75, 0x38, 0x2c, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x2c, 0x20, 0xa, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x70, 0x74, 0x72, 0x28, 0x75, 0x38, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x38, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x2d, 0x31, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x29, 0xa, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x65, 0x69, 0x6c, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x2f, 0x20, 0x34, 0x30, 0x39, 0x36, 0x29, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x3b, 0x20, 0x2b, 0x2b, 0x69, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x20, 0x2b, 0x3d, 0x20, 0x34, 0x30, 0x39, 0x36, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x2d, 0x20, 0x6f, 0x66, 0x66, 0x2c, 0x20, 0x34, 0x30, 0x39, 0x36, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x20, 0x2b, 0x20, 0x6f, 0x66, 0x66, 0x2c, 0x20, 0x74, 0x6f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x29, 0x3b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3e, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x66, 0x64, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x61, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0xa, 0x2f, 0x2f, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6c, 0x69, 0x62, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x6c, 0x69, 0x62, 0x29, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x69, 0x62, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x62, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, 0x62, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x77, 0x65, 0x20, 0x6c, 0x65, 0x61, 0x6b, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x2d, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x60, 0x6c, 0x69, 0x62, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2e, 0x73, 0x6f, 0x60, 0x2c, 0x20, 0x52, 0x54, 0x4c, 0x44, 0x5f, 0x4c, 0x41, 0x5a, 0x59, 0x29, 0x20, 0x7c, 0x7c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x60, 0x24, 0x7b, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0x7d, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2e, 0x73, 0x6f, 0x60, 0x2c, 0x20, 0x52, 0x54, 0x4c, 0x44, 0x5f, 0x4c, 0x41, 0x5a, 0x59, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x73, 0x79, 0x6d, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x60, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x73, 0x79, 0x6d, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x28, 0x73, 0x79, 0x6d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x2e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x6c, 0x69, 0x62, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x60, 0x6c, 0x69, 0x62, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2e, 0x73, 0x6f, 0x60, 0xa, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x62, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, 0x62, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x6f, 0x75, 0x73, 0x20, 0x43, 0x4a, 0x53, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x29, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x72, 0x63, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x73, 0x72, 0x63, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x4c, 0x4f, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x72, 0x79, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x60, 0x24, 0x7b, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0x7d, 0x2f, 0x24, 0x7b, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x7d, 0x60, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x45, 0x53, 0x4d, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0xa, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x72, 0x63, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x73, 0x72, 0x63, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x4c, 0x4f, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x72, 0x79, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x60, 0x24, 0x7b, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0x7d, 0x2f, 0x24, 0x7b, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x7d, 0x60, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0xa, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x6d, 0x6f, 0x64, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2d, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x61, 0x73, 0x79, 0x6e, 0x63, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0xa, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0xa, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x28, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x6d, 0x6f, 0x64, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, 0x20, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x6c, 0x6f, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x60, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, 0x3a, 0x20, 0x24, 0x7b, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x7d, 0x5c, 0x6e, 0x60, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x77, 0x68, 0x79, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x6f, 0x75, 0x73, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x3f, 0x3f, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x77, 0x65, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x68, 0x65, 0x72, 0x65, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2a, 0x2a, 0xa, 0x2a, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x78, 0x69, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6a, 0x73, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x6f, 0x75, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x2e, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x72, 0x65, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0xa, 0x2a, 0x20, 0x62, 0x65, 0x20, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x69, 0x74, 0x27, 0x73, 0x20, 0x75, 0x73, 0x65, 0x66, 0x75, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0xa, 0x2a, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x61, 0x64, 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x69, 0x74, 0x20, 0x77, 0x61, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x6a, 0x75, 0x73, 0x74, 0xa, 0x2a, 0x20, 0x60, 0x60, 0x60, 0xa, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x7b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x7d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0xa, 0x2a, 0x2f, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x77, 0x20, 0x61, 0x73, 0x79, 0x6e, 0x63, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x27, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x27, 0x2c, 0x20, 0x27, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x27, 0x2c, 0x20, 0x27, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x27, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x3a, 0x20, 0x7b, 0x7d, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x66, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x2c, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x29, 0xa, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2a, 0x2a, 0xa, 0x2a, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x64, 0x69, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0xa, 0x2a, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x65, 0x73, 0x74, 0x20, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x6f, 0x20, 0x69, 0x73, 0x20, 0x64, 0x69, 0x65, 0x20, 0x67, 0x72, 0x61, 0x63, 0x65, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x61, 0x73, 0x20, 0x6d, 0x75, 0x63, 0x68, 0x20, 0x61, 0x73, 0x20, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0xa, 0x2a, 0x20, 0x77, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x77, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x73, 0x20, 0x68, 0x65, 0x72, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x62, 0x6c, 0x65, 0xa, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x65, 0x72, 0x72, 0x20, 0x7b, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x7d, 0x20, 0x61, 0x20, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0xa, 0x2a, 0x2f, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x75, 0x6e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x24, 0x7b, 0x41, 0x52, 0x7d, 0x55, 0x6e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x20, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x64, 0x69, 0x65, 0x28, 0x65, 0x72, 0x72, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x20, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x6a, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x69, 0x66, 0x20, 0x77, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x31, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x28, 0x73, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x70, 0x74, 0x72, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x70, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x6e, 0x6c, 0x65, 0x6e, 0x28, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x4d, 0x41, 0x58, 0x5f, 0x45, 0x4e, 0x56, 0x29, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x67, 0x65, 0x74, 0x63, 0x77, 0x64, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x65, 0x74, 0x63, 0x77, 0x64, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x63, 0x77, 0x64, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x77, 0x64, 0x62, 0x75, 0x66, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x4d, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x52, 0x29, 0x29, 0xa, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x63, 0x77, 0x64, 0x28, 0x63, 0x77, 0x64, 0x62, 0x75, 0x66, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x63, 0x77, 0x64, 0x62, 0x75, 0x66, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x70, 0x74, 0x72, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x6e, 0x6c, 0x65, 0x6e, 0x28, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x4d, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x52, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x66, 0x38, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x69, 0x65, 0x20, 0x28, 0x65, 0x72, 0x72, 0x2c, 0x20, 0x68, 0x69, 0x64, 0x65, 0x5f, 0x66, 0x61, 0x74, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x68, 0x69, 0x64, 0x65, 0x5f, 0x66, 0x61, 0x74, 0x61, 0x6c, 0x29, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x24, 0x7b, 0x41, 0x52, 0x7d, 0x46, 0x61, 0x74, 0x61, 0x6c, 0x20, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x24, 0x7b, 0x41, 0x59, 0x7d, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x65, 0x78, 0x69, 0x74, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0xa, 0x20, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0x2c, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x75, 0x74, 0x66, 0x38, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x65, 0x78, 0x69, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x2c, 0xa, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x2c, 0x20, 0x77, 0x72, 0x61, 0x70, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0xa, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x28, 0x27, 0x63, 0x6f, 0x72, 0x65, 0x27, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x4f, 0x5f, 0x57, 0x52, 0x4f, 0x4e, 0x4c, 0x59, 0x2c, 0x20, 0x4f, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x2c, 0x20, 0x4f, 0x5f, 0x54, 0x52, 0x55, 0x4e, 0x43, 0x2c, 0x20, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x2c, 0x20, 0x53, 0x5f, 0x49, 0x57, 0x55, 0x53, 0x52, 0x2c, 0x20, 0x53, 0x5f, 0x49, 0x52, 0x55, 0x53, 0x52, 0x2c, 0x20, 0x53, 0x5f, 0x49, 0x52, 0x47, 0x52, 0x50, 0x2c, 0x20, 0x53, 0x5f, 0x49, 0x52, 0x4f, 0x54, 0x48, 0x2c, 0xa, 0x20, 0x20, 0x53, 0x5f, 0x49, 0x46, 0x52, 0x45, 0x47, 0x2c, 0x20, 0x53, 0x54, 0x44, 0x4f, 0x55, 0x54, 0x2c, 0x20, 0x53, 0x54, 0x44, 0x45, 0x52, 0x52, 0x2c, 0x20, 0x53, 0x5f, 0x49, 0x46, 0x4d, 0x54, 0x2c, 0x20, 0x52, 0x54, 0x4c, 0x44, 0x5f, 0x4c, 0x41, 0x5a, 0x59, 0xa, 0x7d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x2c, 0x20, 0x66, 0x73, 0x74, 0x61, 0x74, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x2c, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x6e, 0x6c, 0x65, 0x6e, 0xa, 0x7d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x29, 0xa, 0x20, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x61, 0x74, 0x61, 0x56, 0x69, 0x65, 0x77, 0x28, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0x2e, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x31, 0x36, 0x28, 0x30, 0x2c, 0x20, 0x32, 0x35, 0x36, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x31, 0x36, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x32, 0x35, 0x36, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x28, 0x62, 0x75, 0x66, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x62, 0x75, 0x66, 0x2c, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6f, 0x73, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x72, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x61, 0x72, 0x63, 0x68, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x4d, 0x41, 0x58, 0x5f, 0x45, 0x4e, 0x56, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x20, 0x3f, 0x20, 0x33, 0x32, 0x37, 0x36, 0x37, 0x20, 0x3a, 0x20, 0x36, 0x35, 0x35, 0x33, 0x36, 0x20, 0x2f, 0x2f, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2d, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x4d, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x52, 0x20, 0x3d, 0x20, 0x36, 0x35, 0x35, 0x33, 0x36, 0x20, 0x2f, 0x2f, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x2d, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x28, 0x53, 0x54, 0x44, 0x4f, 0x55, 0x54, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x44, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x30, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x30, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x30, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x42, 0x6c, 0x61, 0x63, 0x6b, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x52, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x31, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x52, 0x65, 0x64, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x47, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x32, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x47, 0x72, 0x65, 0x65, 0x6e, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x59, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x33, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x59, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x42, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x34, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x42, 0x6c, 0x75, 0x65, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x4d, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x35, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x4d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x61, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x43, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x36, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x43, 0x79, 0x61, 0x6e, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x57, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x37, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x57, 0x68, 0x69, 0x74, 0x65, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x61, 0x64, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x4f, 0x5f, 0x57, 0x52, 0x4f, 0x4e, 0x4c, 0x59, 0x20, 0x7c, 0x20, 0x4f, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x20, 0x7c, 0x20, 0x4f, 0x5f, 0x54, 0x52, 0x55, 0x4e, 0x43, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x53, 0x5f, 0x49, 0x52, 0x55, 0x53, 0x52, 0x20, 0x7c, 0x20, 0x53, 0x5f, 0x49, 0x57, 0x55, 0x53, 0x52, 0x20, 0x7c, 0x20, 0x53, 0x5f, 0x49, 0x52, 0x47, 0x52, 0x50, 0x20, 0x7c, 0x20, 0x53, 0x5f, 0x49, 0x52, 0x4f, 0x54, 0x48, 0xa, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x4f, 0x5f, 0x57, 0x52, 0x4f, 0x4e, 0x4c, 0x59, 0x20, 0x7c, 0x20, 0x4f, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x20, 0x7c, 0x20, 0x4f, 0x5f, 0x54, 0x52, 0x55, 0x4e, 0x43, 0x20, 0x7c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x5f, 0x4f, 0x5f, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0xa, 0x20, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x5f, 0x53, 0x5f, 0x49, 0x57, 0x52, 0x49, 0x54, 0x45, 0xa, 0x20, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x61, 0x64, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x20, 0x7c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x5f, 0x4f, 0x5f, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0xa, 0x7d, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x54, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x28, 0x29, 0xa, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x70, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x29, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x6e, 0x76, 0x5f, 0x62, 0x75, 0x66, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x4d, 0x41, 0x58, 0x5f, 0x45, 0x4e, 0x56, 0x29, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x31, 0x36, 0x30, 0x29, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x74, 0x61, 0x74, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, 0x31, 0x36, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x74, 0x61, 0x74, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x42, 0x69, 0x67, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x74, 0x61, 0x74, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0xa, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x6c, 0x6f, 0x67, 0x3a, 0x20, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x3e, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x53, 0x54, 0x44, 0x4f, 0x55, 0x54, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x73, 0x74, 0x72, 0x7d, 0x5c, 0x6e, 0x60, 0x29, 0x2c, 0xa, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x20, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x3e, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x53, 0x54, 0x44, 0x45, 0x52, 0x52, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x73, 0x74, 0x72, 0x7d, 0x5c, 0x6e, 0x60, 0x29, 0xa, 0x7d, 0xa, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x6e, 0x55, 0x6e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x6f, 0x6e, 0x5f, 0x75, 0x6e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0xa, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0xa, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x54, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0xa, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0xa, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x41, 0x44, 0x2c, 0x20, 0x41, 0x30, 0x2c, 0x20, 0x41, 0x52, 0x2c, 0x20, 0x41, 0x47, 0x2c, 0x20, 0x41, 0x59, 0x2c, 0x20, 0x41, 0x42, 0x2c, 0x20, 0x41, 0x4d, 0x2c, 0x20, 0x41, 0x43, 0x2c, 0x20, 0x41, 0x57, 0x20, 0x7d, 0xa, 0x6c, 0x6f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x6f, 0x6e, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0xa, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0xa, 0x6c, 0x6f, 0x2e, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x70, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x32, 0x20, 0x2a, 0x2a, 0x20, 0x33, 0x32, 0x29, 0x20, 0x2a, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0xa, 0x7d, 0xa, 0x2f, 0x2f, 0x6c, 0x6f, 0x2e, 0x5f, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0xa, 0x2f, 0x2f, 0x6c, 0x6f, 0x2e, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x2f, 0x2f, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x31, 0x29, 0xa, 0x6c, 0x6f, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0xa, 0x6c, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0xa, 0x6c, 0x6f, 0x2e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0xa, 0x6c, 0x6f, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0xa, 0x20, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x77, 0x72, 0x61, 0x70, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x28, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x65, 0x29, 0x29, 0xa, 0x6c, 0x6f, 0x2e, 0x63, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x73, 0x74, 0x72, 0xa, 0x6c, 0x6f, 0x2e, 0x70, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0xa, 0x6c, 0x6f, 0x2e, 0x61, 0x64, 0x64, 0x72, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x72, 0xa, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x77, 0x65, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x20, 0x22, 0x6c, 0x6f, 0x22, 0x3f, 0xa, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x28, 0x29, 0xa, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0xa, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0xa, 0x7d, 0xa, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x63, 0x77, 0x64, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x67, 0x65, 0x74, 0x63, 0x77, 0x64, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x28, 0x27, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0x27, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x63, 0x77, 0x64, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x4c, 0x4f, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x49, 0x6e, 0x74, 0x28, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x28, 0x27, 0x4c, 0x4f, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x27, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x27, 0x30, 0x27, 0x2c, 0x20, 0x31, 0x30, 0x29, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x68, 0x6f, 0x6d, 0x65, 0x64, 0x69, 0x72, 0x20, 0x3d, 0x20, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0xa, 0x2f, 0x2f, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x6f, 0x70, 0x65, 0x6e, 0x29, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x6f, 0x70, 0x65, 0x6e, 0x2c, 0x20, 0x32, 0x29, 0xa, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x73, 0x79, 0x6d, 0x2c, 0x20, 0x32, 0x29, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x6d, 0x61, 0x70, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x6d, 0x61, 0x70, 0x2c, 0x20, 0x36, 0x29, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x2c, 0x20, 0x32, 0x29, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x2c, 0x20, 0x31, 0x29, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x65, 0x6d, 0x63, 0x70, 0x79, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x65, 0x6d, 0x63, 0x70, 0x79, 0x2c, 0x20, 0x33, 0x29, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x65, 0x6d, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x65, 0x6d, 0x6d, 0x6f, 0x76, 0x65, 0x2c, 0x20, 0x33, 0x29, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x2c, 0x20, 0x32, 0x29, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x69, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x28, 0x29, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x2d, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x67, 0x65, 0x74, 0x20, 0x62, 0x6f, 0x74, 0x68, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x72, 0x63, 0x68, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x61, 0x72, 0x6d, 0x36, 0x34, 0x27, 0x20, 0x3f, 0x20, 0x34, 0x20, 0x3a, 0x20, 0x36, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x28, 0x29, 0xa, 0x6c, 0x6f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5f, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x28, 0x29, 0xa, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x5f, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x64, 0x65, 0x70, 0x72, 0x61, 0x63, 0x74, 0x65, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x28, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x66, 0x61, 0x76, 0x6f, 0x75, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x28, 0x29, 0xa, 0x6c, 0x6f, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0xa, 0x2f, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x7d, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x2e, 0x20, 0x77, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x6e, 0x79, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x64, 0x65, 0xa, 0x2f, 0x2f, 0x20, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x2d, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x65, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x6f, 0x20, 0x77, 0x65, 0x20, 0x67, 0x65, 0x74, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x70, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x3f, 0xa, 0x6c, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x28, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, 0x29, 0xa, 0x6c, 0x6f, 0x2e, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0xa, 0x6c, 0x6f, 0x2e, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0x3a, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x63, 0x61, 0x6d, 0x65, 0x6c, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x77, 0x65, 0x20, 0x64, 0x6f, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0xa, 0x2f, 0x2a, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x61, 0x70, 0x73, 0x74, 0x61, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x42, 0x69, 0x67, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x31, 0x36, 0x29, 0xa, 0x6c, 0x6f, 0x2e, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x75, 0x73, 0x61, 0x67, 0x65, 0x28, 0x68, 0x65, 0x61, 0x70, 0x73, 0x74, 0x61, 0x74, 0x73, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x5f, 0x7a, 0x61, 0x70, 0x5f, 0x67, 0x61, 0x72, 0x62, 0x61, 0x67, 0x65, 0x2c, 0x20, 0xa, 0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2c, 0x20, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, 0x2c, 0x20, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, 0x2c, 0x20, 0x70, 0x65, 0x61, 0x6b, 0x5f, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0xa, 0x20, 0x20, 0x5d, 0x20, 0x3d, 0x20, 0x68, 0x65, 0x61, 0x70, 0x73, 0x74, 0x61, 0x74, 0x73, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x5f, 0x7a, 0x61, 0x70, 0x5f, 0x67, 0x61, 0x72, 0x62, 0x61, 0x67, 0x65, 0x2c, 0x20, 0xa, 0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2c, 0x20, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, 0x2c, 0x20, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, 0x2c, 0x20, 0x70, 0x65, 0x61, 0x6b, 0x5f, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0x2a, 0x2f, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x61, 0x70, 0x73, 0x74, 0x61, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x42, 0x69, 0x67, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x31, 0x36, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x75, 0x73, 0x61, 0x67, 0x65, 0x28, 0x68, 0x65, 0x61, 0x70, 0x73, 0x74, 0x61, 0x74, 0x73, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x68, 0x65, 0x61, 0x70, 0x73, 0x74, 0x61, 0x74, 0x73, 0xa, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0xa, 0x2f, 0x2f, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0xa, 0x6c, 0x6f, 0x2e, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x31, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x31, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0xa, 0x6c, 0x6f, 0x2e, 0x70, 0x75, 0x6d, 0x70, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x70, 0x75, 0x6d, 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4c, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0xa, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x61, 0x74, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x41, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0xa, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0xa, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x5f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x54, 0x61, 0x73, 0x6b, 0x73, 0xa, 0x6c, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0xa, 0x6c, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x73, 0xa, 0x6c, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0xa, 0x6c, 0x6f, 0x2e, 0x75, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x75, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0xa, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0xa, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x6f, 0x5f, 0x61, 0x74, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0x41, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0xa, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x6c, 0x6f, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0xa, 0x6c, 0x6f, 0x2e, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x31, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x31, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x66, 0x69, 0x78, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x75, 0x70, 0x2f, 0x64, 0x65, 0x63, 0x69, 0x64, 0x65, 0x20, 0x65, 0x78, 0x61, 0x63, 0x74, 0x6c, 0x79, 0x20, 0x77, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x65, 0x73, 0xa, 0x2f, 0x2f, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x77, 0x65, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x77, 0x69, 0x63, 0x65, 0xa, 0x2f, 0x2a, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x6f, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x60, 0x24, 0x7b, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0x7d, 0x2f, 0x24, 0x7b, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x7d, 0x60, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x68, 0x6f, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x68, 0x6f, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x60, 0x24, 0x7b, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0x7d, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2e, 0x73, 0x6f, 0x60, 0x2c, 0x20, 0x31, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x73, 0x79, 0x6d, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x60, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x73, 0x79, 0x6d, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x28, 0x73, 0x79, 0x6d, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x6c, 0x69, 0x62, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x60, 0x6c, 0x69, 0x62, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2e, 0x73, 0x6f, 0x60, 0xa, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x2e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0xa, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x62, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, 0x62, 0xa, 0x7d, 0xa, 0x2a, 0x2f, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x27, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x27, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x5f, 0x6e, 0x75, 0x6d, 0x29, 0x20, 0x7b, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x60, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x24, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x6f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x28, 0x29, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2d, 0x20, 0x35, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2b, 0x20, 0x35, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x6c, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x59, 0x7d, 0x24, 0x7b, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2d, 0x20, 0x34, 0x29, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x2e, 0x70, 0x61, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x34, 0x2c, 0x20, 0x27, 0x20, 0x27, 0x29, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x20, 0x24, 0x7b, 0x69, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x34, 0x20, 0x3f, 0x20, 0x41, 0x4d, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x24, 0x7b, 0x6c, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x2e, 0x73, 0x72, 0x63, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2d, 0x20, 0x35, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2b, 0x20, 0x35, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x6c, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x59, 0x7d, 0x24, 0x7b, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2d, 0x20, 0x34, 0x29, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x2e, 0x70, 0x61, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x34, 0x2c, 0x20, 0x27, 0x20, 0x27, 0x29, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x20, 0x24, 0x7b, 0x69, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x34, 0x20, 0x3f, 0x20, 0x41, 0x4d, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x24, 0x7b, 0x6c, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x77, 0x65, 0x20, 0x6d, 0x69, 0x67, 0x68, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, 0x69, 0x74, 0x20, 0x77, 0x6f, 0x6e, 0x27, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x74, 0x72, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x69, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x74, 0x68, 0xa, 0x20, 0x20, 0x74, 0x72, 0x79, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2d, 0x20, 0x35, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2b, 0x20, 0x35, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x6c, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x59, 0x7d, 0x24, 0x7b, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2d, 0x20, 0x34, 0x29, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x2e, 0x70, 0x61, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x34, 0x2c, 0x20, 0x27, 0x20, 0x27, 0x29, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x20, 0x24, 0x7b, 0x69, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x34, 0x20, 0x3f, 0x20, 0x41, 0x4d, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x24, 0x7b, 0x6c, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x65, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x60, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x24, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x60, 0x29, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x65, 0x72, 0x72, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x78, 0x5f, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x2f, 0x5c, 0x28, 0x3f, 0x28, 0x5b, 0x5c, 0x77, 0x5c, 0x2f, 0x5c, 0x2e, 0x5c, 0x2d, 0x5f, 0x5d, 0x2b, 0x29, 0x3a, 0x28, 0x5c, 0x64, 0x2b, 0x29, 0x3a, 0x28, 0x5c, 0x64, 0x2b, 0x29, 0x5c, 0x29, 0x3f, 0x2f, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x65, 0x72, 0x72, 0xa, 0x20, 0x20, 0x74, 0x72, 0x79, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3e, 0x20, 0x31, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x72, 0x78, 0x5f, 0x65, 0x72, 0x72, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x28, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5b, 0x31, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x26, 0x26, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3e, 0x20, 0x33, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5b, 0x31, 0x5d, 0x2e, 0x74, 0x72, 0x69, 0x6d, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x49, 0x6e, 0x74, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x31, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x49, 0x6e, 0x74, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x31, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x5f, 0x6e, 0x75, 0x6d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x24, 0x7b, 0x41, 0x52, 0x7d, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x20, 0x24, 0x7b, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x5c, 0x6e, 0x24, 0x7b, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x31, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0x7d, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x24, 0x7b, 0x41, 0x52, 0x7d, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x20, 0x24, 0x7b, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x5c, 0x6e, 0x24, 0x7b, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x31, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x7d, 0x60, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x65, 0x74, 0x63, 0x2e, 0x20, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x61, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x76, 0x65, 0x72, 0x79, 0x20, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x50, 0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x28, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x31, 0x5d, 0xa, 0x20, 0x20, 0x74, 0x72, 0x79, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x67, 0x65, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x67, 0x65, 0x6e, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x29, 0x2e, 0x67, 0x65, 0x6e, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x73, 0x72, 0x63, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x65, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x29, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x29, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x69, 0x6e, 0x69, 0x74, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x29, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x29, 0x2e, 0x75, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x29, 0x2e, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x72, 0x65, 0x70, 0x6c, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x72, 0x65, 0x70, 0x6c, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x29, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x65, 0x76, 0x61, 0x6c, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x32, 0x5d, 0x29, 0x29, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x2c, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x2c, 0x20, 0x74, 0x65, 0x73, 0x74, 0x2c, 0x20, 0x62, 0x65, 0x6e, 0x63, 0x68, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x65, 0x73, 0x74, 0x29, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x74, 0x65, 0x73, 0x74, 0x28, 0x2e, 0x2e, 0x2e, 0x70, 0x61, 0x72, 0x67, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x65, 0x6e, 0x63, 0x68, 0x29, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x62, 0x65, 0x6e, 0x63, 0x68, 0x28, 0x2e, 0x2e, 0x2e, 0x70, 0x61, 0x72, 0x67, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x29, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x70, 0x61, 0x72, 0x67, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x65, 0x72, 0x76, 0x65, 0x29, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x28, 0x2e, 0x2e, 0x2e, 0x70, 0x61, 0x72, 0x67, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x7d, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0xa, 0xa, 0x69, 0x66, 0x20, 0x28, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x64, 0x69, 0x65, 0x29, 0xa, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x28, 0x29, 0xa, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x64, 0x69, 0x65, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x7d, 0x20, 0x2f, 0x2f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0xa, 0xa, 0x74, 0x72, 0x79, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x28, 0x29, 0xa, 0x7d, 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x60, 0x24, 0x7b, 0x65, 0x72, 0x72, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x7d, 0x5c, 0x6e, 0x60, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7b, 0x7d, 0xa +}; +unsigned int _binary_main_js_len = 20014; + +const char _binary_lib_inflate_js_start[] = { +0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x66, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x62, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x27, 0x69, 0x6e, 0x66, 0x6c, 0x61, 0x74, 0x65, 0x27, 0x29, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x2c, 0x20, 0x70, 0x74, 0x72, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x44, 0x45, 0x46, 0x4c, 0x41, 0x54, 0x45, 0x20, 0x3d, 0x20, 0x38, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x4f, 0x53, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x20, 0x3d, 0x20, 0x33, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x28, 0x62, 0x75, 0x66, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5b, 0x20, 0x69, 0x64, 0x31, 0x2c, 0x20, 0x69, 0x64, 0x32, 0x2c, 0x20, 0x63, 0x6d, 0x2c, 0x20, 0x66, 0x6c, 0x67, 0x2c, 0x20, 0x2c, 0x20, 0x2c, 0x20, 0x2c, 0x20, 0x2c, 0x20, 0x78, 0x66, 0x6c, 0x2c, 0x20, 0x6f, 0x73, 0x20, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x75, 0x66, 0x2e, 0x73, 0x75, 0x62, 0x61, 0x72, 0x72, 0x61, 0x79, 0x28, 0x30, 0x2c, 0x20, 0x31, 0x30, 0x29, 0xa, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x69, 0x64, 0x31, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x78, 0x31, 0x66, 0x20, 0x26, 0x26, 0x20, 0x69, 0x64, 0x32, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x78, 0x38, 0x62, 0x2c, 0x20, 0x27, 0x67, 0x7a, 0x69, 0x70, 0x20, 0x6d, 0x61, 0x67, 0x69, 0x63, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x27, 0x29, 0xa, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x63, 0x6d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x44, 0x45, 0x46, 0x4c, 0x41, 0x54, 0x45, 0x2c, 0x20, 0x27, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x20, 0x67, 0x7a, 0x69, 0x70, 0x20, 0x64, 0x65, 0x66, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x27, 0x29, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x4f, 0x53, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x2c, 0x20, 0x27, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x20, 0x75, 0x6e, 0x69, 0x78, 0x20, 0x6f, 0x73, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x27, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x61, 0x74, 0x61, 0x56, 0x69, 0x65, 0x77, 0x28, 0x62, 0x75, 0x66, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x62, 0x75, 0x66, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2d, 0x20, 0x38, 0x2c, 0x20, 0x38, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x67, 0x65, 0x74, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x28, 0x34, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x46, 0x54, 0x45, 0x58, 0x54, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6c, 0x67, 0x20, 0x3e, 0x3e, 0x20, 0x37, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x30, 0x31, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x46, 0x48, 0x43, 0x52, 0x43, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6c, 0x67, 0x20, 0x3e, 0x3e, 0x20, 0x36, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x30, 0x31, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x46, 0x45, 0x58, 0x54, 0x52, 0x41, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6c, 0x67, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x30, 0x31, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x46, 0x4e, 0x41, 0x4d, 0x45, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6c, 0x67, 0x20, 0x3e, 0x3e, 0x20, 0x34, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x30, 0x31, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x46, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x54, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6c, 0x67, 0x20, 0x3e, 0x3e, 0x20, 0x33, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x30, 0x31, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x20, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x64, 0x31, 0x2c, 0x20, 0x69, 0x64, 0x32, 0x2c, 0x20, 0x63, 0x6d, 0x2c, 0x20, 0x66, 0x6c, 0x67, 0x2c, 0x20, 0x78, 0x66, 0x6c, 0x2c, 0x20, 0x6f, 0x73, 0x2c, 0x20, 0x46, 0x54, 0x45, 0x58, 0x54, 0x2c, 0x20, 0x46, 0x48, 0x43, 0x52, 0x43, 0x2c, 0x20, 0x46, 0x45, 0x58, 0x54, 0x52, 0x41, 0x2c, 0x20, 0x46, 0x4e, 0x41, 0x4d, 0x45, 0x2c, 0x20, 0x46, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x54, 0x2c, 0x20, 0x73, 0x69, 0x7a, 0x65, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x66, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x28, 0x62, 0x75, 0x66, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x28, 0x62, 0x75, 0x66, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x62, 0x75, 0x66, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x70, 0x74, 0x72, 0x28, 0x62, 0x75, 0x66, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x65, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x29, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x66, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x62, 0x2e, 0x69, 0x6e, 0x66, 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x62, 0x75, 0x66, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x62, 0x75, 0x66, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0xa, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x60, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x65, 0x64, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x24, 0x7b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x7d, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x24, 0x7b, 0x73, 0x69, 0x7a, 0x65, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x74, 0xa, 0x7d, 0xa, 0xa, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7b, 0x20, 0x69, 0x6e, 0x66, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x7d, 0xa +}; +unsigned int _binary_lib_inflate_js_len = 1087; + +const char _binary_lib_gen_js_start[] = { +0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7b, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x20, 0x7d, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6a, 0x73, 0x27, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x28, 0x6e, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x21, 0x69, 0x73, 0x4e, 0x61, 0x4e, 0x28, 0x70, 0x61, 0x72, 0x73, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x6e, 0x29, 0x29, 0x20, 0x26, 0x26, 0x20, 0x69, 0x73, 0x46, 0x69, 0x6e, 0x69, 0x74, 0x65, 0x28, 0x6e, 0x29, 0x3b, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x20, 0x28, 0x74, 0x2c, 0x20, 0x72, 0x76, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x69, 0x38, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x69, 0x31, 0x36, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x69, 0x33, 0x32, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x38, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x31, 0x36, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x33, 0x32, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x66, 0x33, 0x32, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x66, 0x36, 0x34, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x69, 0x36, 0x34, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x36, 0x34, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x69, 0x73, 0x7a, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x69, 0x6e, 0x74, 0x70, 0x74, 0x72, 0x5f, 0x74, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x73, 0x7a, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x75, 0x69, 0x6e, 0x74, 0x70, 0x74, 0x72, 0x5f, 0x74, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x46, 0x61, 0x73, 0x74, 0x4f, 0x6e, 0x65, 0x42, 0x79, 0x74, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2a, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x76, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x33, 0x32, 0x61, 0x72, 0x72, 0x61, 0x79, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x27, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x2a, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x2a, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x33, 0x32, 0x61, 0x72, 0x72, 0x61, 0x79, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x2a, 0x27, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x46, 0x61, 0x73, 0x74, 0x41, 0x70, 0x69, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2a, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x27, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x33, 0x32, 0x61, 0x72, 0x72, 0x61, 0x79, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x46, 0x61, 0x73, 0x74, 0x41, 0x70, 0x69, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2a, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x76, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x27, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x27, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x46, 0x61, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x27, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x38, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x33, 0x32, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x69, 0x33, 0x32, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x56, 0x6f, 0x69, 0x64, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x36, 0x34, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x69, 0x36, 0x34, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x66, 0x33, 0x32, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x32, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x66, 0x36, 0x34, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x36, 0x34, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x53, 0x65, 0x71, 0x4f, 0x6e, 0x65, 0x42, 0x79, 0x74, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x2c, 0x20, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x3a, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x3a, 0x6b, 0x49, 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x3a, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x3a, 0x3a, 0x6b, 0x4e, 0x6f, 0x6e, 0x65, 0x27, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x33, 0x32, 0x61, 0x72, 0x72, 0x61, 0x79, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2c, 0x20, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x3a, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x3a, 0x6b, 0x49, 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x3a, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x3a, 0x3a, 0x6b, 0x4e, 0x6f, 0x6e, 0x65, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x33, 0x32, 0x61, 0x72, 0x72, 0x61, 0x79, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x27, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x56, 0x6f, 0x69, 0x64, 0x27, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x20, 0x28, 0x74, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x38, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x33, 0x32, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x69, 0x33, 0x32, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x66, 0x33, 0x32, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x28, 0x64, 0x65, 0x66, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x60, 0x2f, 0x2f, 0x20, 0x24, 0x7b, 0x64, 0x65, 0x66, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x28, 0x64, 0x65, 0x66, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x64, 0x65, 0x66, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x70, 0x29, 0x7d, 0x20, 0x70, 0x24, 0x7b, 0x69, 0x7d, 0x60, 0x29, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x27, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x27, 0x29, 0x7d, 0x20, 0x70, 0x5f, 0x72, 0x65, 0x74, 0x60, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x21, 0x28, 0x64, 0x65, 0x66, 0x2e, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x26, 0x26, 0x20, 0x64, 0x65, 0x66, 0x2e, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5b, 0x69, 0x5d, 0x29, 0x29, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x70, 0x29, 0x7d, 0x20, 0x70, 0x24, 0x7b, 0x69, 0x7d, 0x60, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x21, 0x28, 0x64, 0x65, 0x66, 0x2e, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x26, 0x26, 0x20, 0x64, 0x65, 0x66, 0x2e, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5b, 0x69, 0x5d, 0x29, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2a, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x70, 0x29, 0x7d, 0x20, 0x70, 0x24, 0x7b, 0x69, 0x7d, 0x60, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x21, 0x28, 0x64, 0x65, 0x66, 0x2e, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x26, 0x26, 0x20, 0x64, 0x65, 0x66, 0x2e, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5b, 0x69, 0x5d, 0x29, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x28, 0x64, 0x65, 0x66, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x27, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x46, 0x61, 0x73, 0x74, 0x41, 0x70, 0x69, 0x54, 0x79, 0x70, 0x65, 0x64, 0x41, 0x72, 0x72, 0x61, 0x79, 0x2a, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x5f, 0x72, 0x65, 0x74, 0x27, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x2a, 0x2f, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x2c, 0x20, 0x27, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x46, 0x61, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x43, 0x61, 0x73, 0x74, 0x20, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x54, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x7c, 0x7c, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x3e, 0x28, 0x70, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x46, 0x61, 0x73, 0x74, 0x4f, 0x6e, 0x65, 0x42, 0x79, 0x74, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2a, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x70, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x54, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x7c, 0x7c, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x3e, 0x28, 0x70, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x29, 0x3b, 0x60, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5b, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x20, 0x75, 0x38, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x70, 0x2e, 0x41, 0x73, 0x3c, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x28, 0x29, 0x3b, 0x60, 0x2c, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x2a, 0x20, 0x70, 0x74, 0x72, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x2a, 0x29, 0x75, 0x38, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2d, 0x3e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x29, 0x2d, 0x3e, 0x44, 0x61, 0x74, 0x61, 0x28, 0x29, 0x20, 0x2b, 0x20, 0x75, 0x38, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2d, 0x3e, 0x42, 0x79, 0x74, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x29, 0x3b, 0x60, 0x2c, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x3e, 0x28, 0x70, 0x74, 0x72, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x29, 0x3b, 0x60, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x33, 0x32, 0x61, 0x72, 0x72, 0x61, 0x79, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x54, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x7c, 0x7c, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x27, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x3e, 0x28, 0x70, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2d, 0x3e, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x3e, 0x28, 0x70, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3e, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x26, 0x26, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x29, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x70, 0x24, 0x7b, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x7d, 0x24, 0x7b, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x7d, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x29, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x24, 0x7b, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x7d, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x29, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x22, 0x24, 0x7b, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x7d, 0x22, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x27, 0x75, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x27, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x29, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x70, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x53, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x43, 0x61, 0x73, 0x74, 0x20, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x36, 0x34, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x54, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x7c, 0x7c, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x27, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x3e, 0x28, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x29, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x3e, 0x3a, 0x3a, 0x43, 0x61, 0x73, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x5d, 0x29, 0x2d, 0x3e, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x29, 0x29, 0x3b, 0x60, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x54, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x7c, 0x7c, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x27, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x3e, 0x28, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x29, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x3e, 0x3a, 0x3a, 0x43, 0x61, 0x73, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x5d, 0x29, 0x2d, 0x3e, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x29, 0x29, 0x3b, 0x60, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x29, 0x29, 0x3b, 0x5c, 0x6e, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x3e, 0x28, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x29, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x3a, 0x3a, 0x43, 0x61, 0x73, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x5d, 0x29, 0x2d, 0x3e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x29, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x3e, 0x28, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x29, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x3a, 0x3a, 0x43, 0x61, 0x73, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x5d, 0x29, 0x2d, 0x3e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x29, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0x3a, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x55, 0x54, 0x46, 0x2d, 0x38, 0x20, 0x2d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x29, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x2a, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4e, 0x55, 0x4c, 0x4c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x55, 0x74, 0x66, 0x38, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x5d, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x54, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x7c, 0x7c, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x27, 0xa, 0x2f, 0x2a, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5b, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x20, 0x75, 0x38, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x5d, 0x2e, 0x41, 0x73, 0x3c, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x28, 0x29, 0x3b, 0x60, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x2a, 0x20, 0x70, 0x74, 0x72, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x2a, 0x29, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x5d, 0x2e, 0x41, 0x73, 0x3c, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x3e, 0x28, 0x29, 0x2d, 0x3e, 0x44, 0x61, 0x74, 0x61, 0x28, 0x29, 0x3b, 0x60, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x3e, 0x28, 0x70, 0x74, 0x72, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x2a, 0x2f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x3e, 0x28, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x29, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x3a, 0x3a, 0x43, 0x61, 0x73, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x5d, 0x29, 0x2d, 0x3e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x29, 0x29, 0x3b, 0x60, 0xa, 0x2f, 0x2a, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x20, 0x75, 0x38, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x5d, 0x2e, 0x41, 0x73, 0x3c, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x28, 0x29, 0x3b, 0x60, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x2a, 0x20, 0x70, 0x74, 0x72, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x2a, 0x29, 0x75, 0x38, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2d, 0x3e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x29, 0x2d, 0x3e, 0x44, 0x61, 0x74, 0x61, 0x28, 0x29, 0x20, 0x2b, 0x20, 0x75, 0x38, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2d, 0x3e, 0x42, 0x79, 0x74, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x29, 0x3b, 0x60, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x3e, 0x28, 0x70, 0x74, 0x72, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x2a, 0x2f, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x33, 0x32, 0x61, 0x72, 0x72, 0x61, 0x79, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x54, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x7c, 0x7c, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x3e, 0x28, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x29, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x3a, 0x3a, 0x43, 0x61, 0x73, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x5d, 0x29, 0x2d, 0x3e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x29, 0x29, 0x3b, 0x60, 0xa, 0x2f, 0x2a, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x20, 0x75, 0x33, 0x32, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x5d, 0x2e, 0x41, 0x73, 0x3c, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x28, 0x29, 0x3b, 0x60, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x2a, 0x20, 0x70, 0x74, 0x72, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x2a, 0x29, 0x75, 0x33, 0x32, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2d, 0x3e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x29, 0x2d, 0x3e, 0x44, 0x61, 0x74, 0x61, 0x28, 0x29, 0x20, 0x2b, 0x20, 0x75, 0x33, 0x32, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2d, 0x3e, 0x42, 0x79, 0x74, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x29, 0x3b, 0x60, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x3e, 0x28, 0x70, 0x74, 0x72, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x2a, 0x2f, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x29, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x76, 0x24, 0x7b, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x7d, 0x24, 0x7b, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x73, 0x6c, 0x6f, 0x77, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x7d, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x29, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x3a, 0x3a, 0x43, 0x61, 0x73, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x5d, 0x29, 0x2d, 0x3e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x69, 0x74, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x3a, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x3a, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x46, 0x61, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x70, 0x29, 0x7d, 0x29, 0x2c, 0x60, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x28, 0x7b, 0x20, 0x61, 0x70, 0x69, 0x2c, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x61, 0x6d, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2c, 0x20, 0x6d, 0x61, 0x63, 0x2c, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x29, 0x20, 0x7b, 0xa, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x63, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0xa, 0xa, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x61, 0x70, 0x69, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6e, 0x20, 0x3d, 0x20, 0x61, 0x70, 0x69, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6e, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x5b, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6e, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x20, 0x26, 0x26, 0x20, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2e, 0x61, 0x70, 0x69, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2e, 0x61, 0x70, 0x69, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6e, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2e, 0x61, 0x70, 0x69, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6e, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x5b, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6e, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x61, 0x63, 0x20, 0x26, 0x26, 0x20, 0x6d, 0x61, 0x63, 0x2e, 0x61, 0x70, 0x69, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x6d, 0x61, 0x63, 0x2e, 0x61, 0x70, 0x69, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6e, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2e, 0x61, 0x70, 0x69, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6e, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x5b, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6e, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x63, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x28, 0x6e, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x2e, 0x68, 0x61, 0x73, 0x4f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x6e, 0x29, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x5b, 0x6e, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x33, 0x32, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x53, 0x45, 0x54, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x22, 0x24, 0x7b, 0x6e, 0x7d, 0x22, 0x2c, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3a, 0x3a, 0x4e, 0x65, 0x77, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x29, 0x24, 0x7b, 0x6e, 0x7d, 0x29, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x27, 0x69, 0x33, 0x32, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x53, 0x45, 0x54, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x22, 0x24, 0x7b, 0x6e, 0x7d, 0x22, 0x2c, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3a, 0x3a, 0x4e, 0x65, 0x77, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x29, 0x24, 0x7b, 0x6e, 0x7d, 0x29, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x27, 0x75, 0x36, 0x34, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x53, 0x45, 0x54, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x22, 0x24, 0x7b, 0x6e, 0x7d, 0x22, 0x2c, 0x20, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x3a, 0x3a, 0x4e, 0x65, 0x77, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x29, 0x24, 0x7b, 0x6e, 0x7d, 0x29, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x27, 0x69, 0x36, 0x34, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x53, 0x45, 0x54, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x22, 0x24, 0x7b, 0x6e, 0x7d, 0x22, 0x2c, 0x20, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x3a, 0x3a, 0x4e, 0x65, 0x77, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x29, 0x24, 0x7b, 0x6e, 0x7d, 0x29, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x73, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x28, 0x74, 0x79, 0x70, 0x65, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x53, 0x45, 0x54, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x22, 0x24, 0x7b, 0x6e, 0x7d, 0x22, 0x2c, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x3a, 0x3a, 0x4e, 0x65, 0x77, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x29, 0x24, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x7d, 0x29, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x27, 0x54, 0x4f, 0x44, 0x4f, 0x27, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x28, 0x6e, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x53, 0x45, 0x54, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x24, 0x7b, 0x6e, 0x7d, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3a, 0x3a, 0x4e, 0x65, 0x77, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x6f, 0x66, 0x28, 0x24, 0x7b, 0x6e, 0x7d, 0x29, 0x29, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x6e, 0x2c, 0x20, 0x61, 0x70, 0x69, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x61, 0x70, 0x69, 0x5b, 0x6e, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6e, 0x6f, 0x66, 0x61, 0x73, 0x74, 0x20, 0x7c, 0x7c, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x73, 0x6c, 0x6f, 0x77, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x53, 0x45, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x22, 0x24, 0x7b, 0x6e, 0x7d, 0x22, 0x2c, 0x20, 0x24, 0x7b, 0x6e, 0x7d, 0x53, 0x6c, 0x6f, 0x77, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x53, 0x45, 0x54, 0x5f, 0x46, 0x41, 0x53, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x22, 0x24, 0x7b, 0x6e, 0x7d, 0x22, 0x2c, 0x20, 0x26, 0x70, 0x46, 0x24, 0x7b, 0x6e, 0x7d, 0x2c, 0x20, 0x24, 0x7b, 0x6e, 0x7d, 0x53, 0x6c, 0x6f, 0x77, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x46, 0x61, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x63, 0x6c, 0x20, 0x28, 0x6e, 0x2c, 0x20, 0x61, 0x70, 0x69, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x61, 0x70, 0x69, 0x5b, 0x6e, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x2c, 0x20, 0x6e, 0x6f, 0x66, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x6c, 0x6f, 0x77, 0x2c, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x66, 0x61, 0x73, 0x74, 0x20, 0x7c, 0x7c, 0x20, 0x73, 0x6c, 0x6f, 0x77, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x26, 0x26, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x26, 0x26, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3e, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x5f, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x76, 0x20, 0x3d, 0x3e, 0x20, 0x76, 0x29, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x30, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2d, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x5f, 0x6c, 0x65, 0x6e, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x60, 0x5c, 0x6e, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x24, 0x7b, 0x6e, 0x7d, 0x46, 0x61, 0x73, 0x74, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x20, 0x70, 0x24, 0x7b, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x7c, 0x7c, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x28, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x2c, 0x20, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x28, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x7d, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x60, 0x5c, 0x6e, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x24, 0x7b, 0x6e, 0x7d, 0x46, 0x61, 0x73, 0x74, 0x28, 0x76, 0x38, 0x3a, 0x3a, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x76, 0x38, 0x3a, 0x3a, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3e, 0x20, 0x70, 0x24, 0x7b, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x7c, 0x7c, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x28, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x2c, 0x20, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x28, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x7d, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x5c, 0x6e, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x20, 0x63, 0x61, 0x72, 0x67, 0x73, 0x24, 0x7b, 0x6e, 0x7d, 0x5b, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x32, 0x7d, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x3a, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x3a, 0x6b, 0x56, 0x38, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x2c, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x67, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x69, 0x74, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x2c, 0x20, 0x6e, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x7d, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x3a, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x3a, 0x6b, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x29, 0x5c, 0x6e, 0x60, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x3a, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x3a, 0x6b, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2c, 0x20, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x3a, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x3a, 0x6b, 0x49, 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x3a, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x3a, 0x3a, 0x6b, 0x4e, 0x6f, 0x6e, 0x65, 0x29, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x27, 0x7d, 0x3b, 0x5c, 0x6e, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x20, 0x72, 0x63, 0x24, 0x7b, 0x6e, 0x7d, 0x20, 0x3d, 0x20, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x3a, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x3a, 0x6b, 0x56, 0x6f, 0x69, 0x64, 0x29, 0x3b, 0xa, 0x43, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x24, 0x7b, 0x6e, 0x7d, 0x20, 0x3d, 0x20, 0x43, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x72, 0x63, 0x24, 0x7b, 0x6e, 0x7d, 0x2c, 0x20, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x32, 0x7d, 0x2c, 0x20, 0x63, 0x61, 0x72, 0x67, 0x73, 0x24, 0x7b, 0x6e, 0x7d, 0x29, 0x3b, 0xa, 0x43, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x46, 0x24, 0x7b, 0x6e, 0x7d, 0x20, 0x3d, 0x20, 0x43, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x29, 0x26, 0x24, 0x7b, 0x6e, 0x7d, 0x46, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x26, 0x69, 0x6e, 0x66, 0x6f, 0x24, 0x7b, 0x6e, 0x7d, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0x3b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x60, 0x5c, 0x6e, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x7d, 0x20, 0x24, 0x7b, 0x6e, 0x7d, 0x46, 0x61, 0x73, 0x74, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x20, 0x70, 0x24, 0x7b, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x7c, 0x7c, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x28, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x2c, 0x20, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x28, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x7d, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x60, 0x5c, 0x6e, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x7d, 0x20, 0x24, 0x7b, 0x6e, 0x7d, 0x46, 0x61, 0x73, 0x74, 0x28, 0x76, 0x38, 0x3a, 0x3a, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x76, 0x38, 0x3a, 0x3a, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3e, 0x20, 0x70, 0x24, 0x7b, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x7c, 0x7c, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x28, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x2c, 0x20, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x28, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x7d, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x5c, 0x6e, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x20, 0x63, 0x61, 0x72, 0x67, 0x73, 0x24, 0x7b, 0x6e, 0x7d, 0x5b, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x31, 0x7d, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x3a, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x3a, 0x6b, 0x56, 0x38, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x2c, 0xa, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x67, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x69, 0x74, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x2c, 0x20, 0x6e, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x7d, 0xa, 0x7d, 0x3b, 0xa, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x20, 0x72, 0x63, 0x24, 0x7b, 0x6e, 0x7d, 0x20, 0x3d, 0x20, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x3a, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x3a, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x46, 0x61, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x7d, 0x29, 0x3b, 0xa, 0x43, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x24, 0x7b, 0x6e, 0x7d, 0x20, 0x3d, 0x20, 0x43, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x72, 0x63, 0x24, 0x7b, 0x6e, 0x7d, 0x2c, 0x20, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x31, 0x7d, 0x2c, 0x20, 0x63, 0x61, 0x72, 0x67, 0x73, 0x24, 0x7b, 0x6e, 0x7d, 0x29, 0x3b, 0xa, 0x43, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x46, 0x24, 0x7b, 0x6e, 0x7d, 0x20, 0x3d, 0x20, 0x43, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x29, 0x26, 0x24, 0x7b, 0x6e, 0x7d, 0x46, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x26, 0x69, 0x6e, 0x66, 0x6f, 0x24, 0x7b, 0x6e, 0x7d, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x6e, 0x2c, 0x20, 0x61, 0x70, 0x69, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x61, 0x70, 0x69, 0x5b, 0x6e, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x2c, 0x20, 0x72, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x2c, 0x20, 0x6e, 0x6f, 0x66, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x6c, 0x6f, 0x77, 0x2c, 0x20, 0x63, 0x61, 0x73, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0x2c, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0x7d, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x43, 0x61, 0x73, 0x74, 0x20, 0x28, 0x69, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x24, 0x7b, 0x63, 0x61, 0x73, 0x74, 0x73, 0x5b, 0x69, 0x5d, 0x20, 0x3f, 0x20, 0x63, 0x61, 0x73, 0x74, 0x73, 0x5b, 0x69, 0x5d, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x60, 0xa, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x24, 0x7b, 0x6e, 0x7d, 0x53, 0x6c, 0x6f, 0x77, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x3c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3e, 0x20, 0x26, 0x61, 0x72, 0x67, 0x73, 0x29, 0x20, 0x7b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x69, 0x66, 0x20, 0x28, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x27, 0x20, 0x26, 0x26, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x27, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x27, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x27, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x27, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x27, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x27, 0x75, 0x33, 0x32, 0x61, 0x72, 0x72, 0x61, 0x79, 0x27, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x69, 0x66, 0x20, 0x28, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x27, 0x20, 0x26, 0x26, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x27, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x69, 0x36, 0x34, 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x36, 0x34, 0x27, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x49, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x2a, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x27, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x27, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x5c, 0x6e, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x3e, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2d, 0x3e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x28, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x67, 0x65, 0x74, 0x53, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x43, 0x61, 0x73, 0x74, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x2c, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x7d, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x28, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x24, 0x7b, 0x70, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x20, 0x3f, 0x20, 0x67, 0x65, 0x74, 0x43, 0x61, 0x73, 0x74, 0x28, 0x69, 0x29, 0x20, 0x2b, 0x20, 0x27, 0x2a, 0x27, 0x20, 0x3a, 0x20, 0x67, 0x65, 0x74, 0x43, 0x61, 0x73, 0x74, 0x28, 0x69, 0x29, 0x7d, 0x76, 0x24, 0x7b, 0x69, 0x7d, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x2c, 0x20, 0x27, 0x29, 0x7d, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x72, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x7c, 0x7c, 0x20, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x7d, 0x20, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x28, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x24, 0x7b, 0x70, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x20, 0x3f, 0x20, 0x60, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x43, 0x61, 0x73, 0x74, 0x28, 0x69, 0x29, 0x7d, 0x2a, 0x60, 0x20, 0x3a, 0x20, 0x67, 0x65, 0x74, 0x43, 0x61, 0x73, 0x74, 0x28, 0x69, 0x29, 0x7d, 0x76, 0x24, 0x7b, 0x69, 0x7d, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x2c, 0x20, 0x27, 0x29, 0x7d, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x29, 0x2e, 0x53, 0x65, 0x74, 0x28, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x3a, 0x3a, 0x4e, 0x65, 0x77, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x3e, 0x28, 0x72, 0x63, 0x29, 0x29, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x3e, 0x20, 0x61, 0x62, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2d, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x76, 0x20, 0x3d, 0x3e, 0x20, 0x76, 0x29, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x7d, 0x5d, 0x2e, 0x41, 0x73, 0x3c, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x28, 0x29, 0x2d, 0x3e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x28, 0x28, 0x24, 0x7b, 0x72, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x7c, 0x7c, 0x20, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x7d, 0x2a, 0x29, 0x61, 0x62, 0x2d, 0x3e, 0x44, 0x61, 0x74, 0x61, 0x28, 0x29, 0x29, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x72, 0x63, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x69, 0x36, 0x34, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x29, 0x2e, 0x53, 0x65, 0x74, 0x28, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x3a, 0x3a, 0x4e, 0x65, 0x77, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x3e, 0x28, 0x72, 0x63, 0x29, 0x29, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x36, 0x34, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x29, 0x2e, 0x53, 0x65, 0x74, 0x28, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x3a, 0x3a, 0x4e, 0x65, 0x77, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x3e, 0x28, 0x72, 0x63, 0x29, 0x29, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x29, 0x2e, 0x53, 0x65, 0x74, 0x28, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x3a, 0x3a, 0x4e, 0x65, 0x77, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x63, 0x29, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x29, 0x2e, 0x53, 0x65, 0x74, 0x28, 0x72, 0x63, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x7d, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x66, 0x61, 0x73, 0x74, 0x20, 0x7c, 0x7c, 0x20, 0x73, 0x6c, 0x6f, 0x77, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0xa, 0x24, 0x7b, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x27, 0x20, 0x3a, 0x20, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x7d, 0x20, 0x24, 0x7b, 0x6e, 0x7d, 0x46, 0x61, 0x73, 0x74, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x20, 0x70, 0x24, 0x7b, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x7c, 0x7c, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x28, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x2c, 0x20, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x28, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x7d, 0x29, 0x20, 0x7b, 0xa, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x67, 0x65, 0x74, 0x46, 0x61, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x43, 0x61, 0x73, 0x74, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x2c, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x7d, 0x60, 0xa, 0x2f, 0x2f, 0x24, 0x7b, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x28, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x27, 0x20, 0x3a, 0x20, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x7d, 0x20, 0x24, 0x7b, 0x6e, 0x7d, 0x46, 0x61, 0x73, 0x74, 0x28, 0x76, 0x38, 0x3a, 0x3a, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x76, 0x38, 0x3a, 0x3a, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3e, 0x20, 0x70, 0x24, 0x7b, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x7c, 0x7c, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x28, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x2c, 0x20, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x28, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x7d, 0x29, 0x20, 0x7b, 0xa, 0x2f, 0x2f, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x67, 0x65, 0x74, 0x46, 0x61, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x43, 0x61, 0x73, 0x74, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x2c, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x7d, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x5c, 0x6e, 0x20, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x28, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x43, 0x61, 0x73, 0x74, 0x28, 0x69, 0x29, 0x7d, 0x76, 0x24, 0x7b, 0x69, 0x7d, 0x24, 0x7b, 0x70, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x20, 0x3f, 0x20, 0x27, 0x2d, 0x3e, 0x64, 0x61, 0x74, 0x61, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x2c, 0x20, 0x27, 0x29, 0x7d, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x5c, 0x6e, 0x20, 0x20, 0x24, 0x7b, 0x72, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x7c, 0x7c, 0x20, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x7d, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x28, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x43, 0x61, 0x73, 0x74, 0x28, 0x69, 0x29, 0x7d, 0x76, 0x24, 0x7b, 0x69, 0x7d, 0x24, 0x7b, 0x70, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x20, 0x3f, 0x20, 0x27, 0x2d, 0x3e, 0x64, 0x61, 0x74, 0x61, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x2c, 0x20, 0x27, 0x29, 0x7d, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x5c, 0x6e, 0x20, 0x20, 0x28, 0x28, 0x24, 0x7b, 0x72, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x7c, 0x7c, 0x20, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x7d, 0x2a, 0x29, 0x70, 0x5f, 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x5c, 0x6e, 0x20, 0x20, 0x70, 0x5f, 0x72, 0x65, 0x74, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x29, 0x72, 0x3b, 0x60, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x28, 0x28, 0x24, 0x7b, 0x72, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x7c, 0x7c, 0x20, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x7d, 0x2a, 0x29, 0x70, 0x5f, 0x72, 0x65, 0x74, 0x2d, 0x3e, 0x64, 0x61, 0x74, 0x61, 0x29, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x72, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x5c, 0x6e, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x28, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x43, 0x61, 0x73, 0x74, 0x28, 0x69, 0x29, 0x7d, 0x76, 0x24, 0x7b, 0x69, 0x7d, 0x24, 0x7b, 0x70, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x20, 0x3f, 0x20, 0x27, 0x2d, 0x3e, 0x64, 0x61, 0x74, 0x61, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x2c, 0x20, 0x27, 0x29, 0x7d, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x27, 0x5c, 0x6e, 0x7d, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0xa, 0x2f, 0x2f, 0x20, 0x5b, 0x64, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x64, 0x69, 0x74, 0x2c, 0x3c, 0x61, 0x75, 0x74, 0x6f, 0x2d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x2f, 0x3e, 0x5d, 0xa, 0x2f, 0x2f, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x75, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x2d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x61, 0x6b, 0x65, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x20, 0xa, 0x24, 0x7b, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0xa, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x63, 0x70, 0x6c, 0x75, 0x73, 0x70, 0x6c, 0x75, 0x73, 0xa, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x22, 0x43, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0xa, 0x60, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x24, 0x7b, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x7d, 0x3e, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0xa, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x63, 0x70, 0x6c, 0x75, 0x73, 0x70, 0x6c, 0x75, 0x73, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0xa, 0x60, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, 0xa, 0x7d, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x7d, 0xa, 0xa, 0x24, 0x7b, 0x28, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x20, 0x26, 0x26, 0x20, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x29, 0x20, 0x3f, 0x20, 0x5b, 0x27, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x5f, 0x27, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x24, 0x7b, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x7d, 0x3e, 0x60, 0x29, 0x2c, 0x20, 0x27, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x27, 0x5d, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0xa, 0x24, 0x7b, 0x28, 0x6d, 0x61, 0x63, 0x20, 0x26, 0x26, 0x20, 0x6d, 0x61, 0x63, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x29, 0x20, 0x3f, 0x20, 0x5b, 0x27, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x5f, 0x5f, 0x27, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x6d, 0x61, 0x63, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x24, 0x7b, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x7d, 0x3e, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x2c, 0x20, 0x27, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x27, 0x5d, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0xa, 0xa, 0xa, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x24, 0x7b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x7d, 0x2e, 0x68, 0x3e, 0xa, 0xa, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x24, 0x7b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x7d, 0x20, 0x7b, 0xa, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x20, 0x7b, 0xa, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x49, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x43, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x43, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x3b, 0xa, 0xa, 0x24, 0x7b, 0x70, 0x72, 0x65, 0x61, 0x6d, 0x62, 0x6c, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x27, 0x27, 0x7d, 0xa, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x5f, 0xa, 0x24, 0x7b, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x3f, 0x2e, 0x70, 0x72, 0x65, 0x61, 0x6d, 0x62, 0x6c, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x27, 0x27, 0x7d, 0xa, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0xa, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x5f, 0x5f, 0xa, 0x24, 0x7b, 0x6d, 0x61, 0x63, 0x3f, 0x2e, 0x70, 0x72, 0x65, 0x61, 0x6d, 0x62, 0x6c, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x27, 0x27, 0x7d, 0xa, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0xa, 0x24, 0x7b, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6e, 0x20, 0x3d, 0x3e, 0x20, 0x67, 0x65, 0x74, 0x46, 0x61, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x63, 0x6c, 0x28, 0x6e, 0x2c, 0x20, 0x61, 0x70, 0x69, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0xa, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x5f, 0xa, 0x24, 0x7b, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6e, 0x20, 0x3d, 0x3e, 0x20, 0x67, 0x65, 0x74, 0x46, 0x61, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x63, 0x6c, 0x28, 0x6e, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2e, 0x61, 0x70, 0x69, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0xa, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0xa, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x5f, 0x5f, 0xa, 0x24, 0x7b, 0x6d, 0x61, 0x63, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6e, 0x20, 0x3d, 0x3e, 0x20, 0x67, 0x65, 0x74, 0x46, 0x61, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x63, 0x6c, 0x28, 0x6e, 0x2c, 0x20, 0x6d, 0x61, 0x63, 0x2e, 0x61, 0x70, 0x69, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0xa, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0xa, 0x24, 0x7b, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6e, 0x20, 0x3d, 0x3e, 0x20, 0x67, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x20, 0x61, 0x70, 0x69, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0xa, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x5f, 0xa, 0x24, 0x7b, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6e, 0x20, 0x3d, 0x3e, 0x20, 0x67, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2e, 0x61, 0x70, 0x69, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0xa, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0xa, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x5f, 0x5f, 0xa, 0x24, 0x7b, 0x6d, 0x61, 0x63, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6e, 0x20, 0x3d, 0x3e, 0x20, 0x67, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x20, 0x6d, 0x61, 0x63, 0x2e, 0x61, 0x70, 0x69, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0xa, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0xa, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x49, 0x6e, 0x69, 0x74, 0x28, 0x49, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2a, 0x20, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x3e, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x3e, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x3a, 0x3a, 0x4e, 0x65, 0x77, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x29, 0x3b, 0xa, 0x24, 0x7b, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6e, 0x20, 0x3d, 0x3e, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x20, 0x61, 0x70, 0x69, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0xa, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x5f, 0xa, 0x24, 0x7b, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6e, 0x20, 0x3d, 0x3e, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2e, 0x61, 0x70, 0x69, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0xa, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0xa, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x5f, 0x5f, 0xa, 0x24, 0x7b, 0x6d, 0x61, 0x63, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6e, 0x20, 0x3d, 0x3e, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x20, 0x6d, 0x61, 0x63, 0x2e, 0x61, 0x70, 0x69, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0xa, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0xa, 0x24, 0x7b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x7b, 0x7d, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6e, 0x20, 0x3d, 0x3e, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x28, 0x6e, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0xa, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x5f, 0xa, 0x24, 0x7b, 0x28, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x20, 0x26, 0x26, 0x20, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x29, 0x20, 0x3f, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x7b, 0x7d, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6e, 0x20, 0x3d, 0x3e, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x28, 0x6e, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0xa, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0xa, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x5f, 0x5f, 0xa, 0x24, 0x7b, 0x28, 0x6d, 0x61, 0x63, 0x20, 0x26, 0x26, 0x20, 0x6d, 0x61, 0x63, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x29, 0x20, 0x3f, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x6d, 0x61, 0x63, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x7b, 0x7d, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6e, 0x20, 0x3d, 0x3e, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x28, 0x6e, 0x2c, 0x20, 0x6d, 0x61, 0x63, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0xa, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0xa, 0xa, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x5f, 0x5f, 0xa, 0x24, 0x7b, 0x5b, 0x2e, 0x2e, 0x2e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x73, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x28, 0x6d, 0x61, 0x63, 0x3f, 0x2e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x5b, 0x5d, 0x29, 0x5d, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x69, 0x6e, 0x69, 0x74, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0xa, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0xa, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x5f, 0xa, 0x24, 0x7b, 0x5b, 0x2e, 0x2e, 0x2e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x73, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x28, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x3f, 0x2e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x5b, 0x5d, 0x29, 0x5d, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x69, 0x6e, 0x69, 0x74, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0xa, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0xa, 0x20, 0x20, 0x53, 0x45, 0x54, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2c, 0x20, 0x22, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x22, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x29, 0x3b, 0xa, 0x7d, 0xa, 0x7d, 0x20, 0x2f, 0x2f, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0xa, 0x7d, 0x20, 0x2f, 0x2f, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x24, 0x7b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x7d, 0xa, 0xa, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x22, 0x43, 0x22, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x44, 0x4c, 0x4c, 0x5f, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x20, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x29, 0x24, 0x7b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x7d, 0x3a, 0x3a, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x3a, 0x49, 0x6e, 0x69, 0x74, 0x3b, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0x60, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x78, 0x20, 0x3d, 0x20, 0x2f, 0x5b, 0x2e, 0x2f, 0x2d, 0x5d, 0x2f, 0x67, 0xa, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0xa, 0x69, 0x66, 0x20, 0x28, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2e, 0x44, 0x65, 0x6e, 0x6f, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x72, 0x65, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0x20, 0x3d, 0x3e, 0x20, 0x44, 0x65, 0x6e, 0x6f, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x28, 0x66, 0x6e, 0x29, 0xa, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2e, 0x42, 0x75, 0x6e, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x27, 0x66, 0x73, 0x27, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0x20, 0x3d, 0x3e, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x66, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x28, 0x66, 0x6e, 0x29, 0x29, 0xa, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x72, 0x65, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x2d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x2c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x20, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x27, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x60, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x72, 0x78, 0x2c, 0x20, 0x27, 0x5f, 0x27, 0x29, 0x7d, 0x60, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x60, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x7d, 0x2f, 0x24, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x60, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x73, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0xa, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x3a, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x69, 0x6e, 0x63, 0x62, 0x69, 0x6e, 0x20, 0x22, 0x24, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x65, 0x6e, 0x64, 0xa, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x65, 0x6e, 0x64, 0x3a, 0xa, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x5f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0xa, 0x5f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x3a, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x69, 0x6e, 0x63, 0x62, 0x69, 0x6e, 0x20, 0x22, 0x24, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x5f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x65, 0x6e, 0x64, 0xa, 0x5f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x65, 0x6e, 0x64, 0x3a, 0xa, 0x60, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x60, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5b, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0xa, 0x24, 0x7b, 0x41, 0x72, 0x72, 0x61, 0x79, 0x2e, 0x66, 0x72, 0x6f, 0x6d, 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x62, 0x20, 0x3d, 0x3e, 0x20, 0x27, 0x30, 0x78, 0x27, 0x20, 0x2b, 0x20, 0x62, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x31, 0x36, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x2c, 0x20, 0x27, 0x29, 0x7d, 0xa, 0x7d, 0x3b, 0x20, 0xa, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x24, 0x7b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x7d, 0x3b, 0xa, 0x60, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x27, 0x2f, 0x27, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x27, 0x2f, 0x27, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x27, 0x2e, 0x27, 0x29, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x27, 0x2e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x6f, 0x73, 0x20, 0x3c, 0x20, 0x30, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x70, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x31, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x41, 0x72, 0x67, 0x73, 0x20, 0x28, 0x64, 0x65, 0x70, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4f, 0x70, 0x74, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x70, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x64, 0x65, 0x70, 0x20, 0x3d, 0x3e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x64, 0x65, 0x70, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x61, 0x70, 0x69, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x50, 0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x3e, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x29, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x2e, 0x66, 0x72, 0x6f, 0x6d, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x53, 0x65, 0x74, 0x28, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x62, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x5b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x73, 0x5d, 0x3f, 0x2e, 0x6c, 0x69, 0x62, 0x73, 0x3f, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x62, 0x5b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x73, 0x5d, 0x2e, 0x6c, 0x69, 0x62, 0x73, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x62, 0x2e, 0x6c, 0x69, 0x62, 0x73, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x2e, 0x6c, 0x69, 0x62, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x5b, 0x5d, 0xa, 0x20, 0x20, 0x7d, 0x29, 0x2e, 0x66, 0x6c, 0x61, 0x74, 0x28, 0x29, 0x29, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6c, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x2d, 0x6c, 0x24, 0x7b, 0x6c, 0x7d, 0x60, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x69, 0x62, 0x50, 0x61, 0x74, 0x68, 0x73, 0x20, 0x28, 0x64, 0x65, 0x70, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4f, 0x70, 0x74, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x70, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x64, 0x65, 0x70, 0x20, 0x3d, 0x3e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x64, 0x65, 0x70, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x61, 0x70, 0x69, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x50, 0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x3e, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x29, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x62, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x20, 0x3d, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x2e, 0x66, 0x72, 0x6f, 0x6d, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x53, 0x65, 0x74, 0x28, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x62, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x5b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x73, 0x5d, 0x3f, 0x2e, 0x6c, 0x69, 0x62, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x3f, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4f, 0x70, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x7c, 0x7c, 0x20, 0x62, 0x5b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x73, 0x5d, 0x2e, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x62, 0x5b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x73, 0x5d, 0x2e, 0x6c, 0x69, 0x62, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x70, 0x20, 0x3d, 0x3e, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x2c, 0x20, 0x70, 0x29, 0x29, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x62, 0x2e, 0x6c, 0x69, 0x62, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x70, 0x20, 0x3d, 0x3e, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x2c, 0x20, 0x70, 0x29, 0x29, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x62, 0x5b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x73, 0x5d, 0x2e, 0x6c, 0x69, 0x62, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x62, 0x2e, 0x6c, 0x69, 0x62, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x62, 0x2e, 0x6c, 0x69, 0x62, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x5b, 0x5d, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x70, 0x20, 0x3d, 0x3e, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x2c, 0x20, 0x70, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x2e, 0x6c, 0x69, 0x62, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x5b, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0x29, 0x2e, 0x66, 0x6c, 0x61, 0x74, 0x28, 0x29, 0x29, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, 0x62, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6c, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x2d, 0x4c, 0x24, 0x7b, 0x6c, 0x7d, 0x60, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x64, 0x65, 0x70, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x27, 0x27, 0x2c, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x27, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x6a, 0x73, 0x27, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4f, 0x70, 0x74, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x62, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x70, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x64, 0x65, 0x70, 0x20, 0x3d, 0x3e, 0x20, 0x65, 0x78, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x64, 0x65, 0x70, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x61, 0x27, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x70, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x64, 0x65, 0x70, 0x20, 0x3d, 0x3e, 0x20, 0x65, 0x78, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x64, 0x65, 0x70, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x61, 0x27, 0x29, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x60, 0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x6f, 0x6e, 0x63, 0x65, 0xa, 0x2f, 0x2f, 0x20, 0x5b, 0x64, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x64, 0x69, 0x74, 0x2c, 0x3c, 0x61, 0x75, 0x74, 0x6f, 0x2d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x2f, 0x3e, 0x5d, 0xa, 0x2f, 0x2f, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x75, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x2d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x61, 0x6b, 0x65, 0x66, 0x69, 0x6c, 0x65, 0xa, 0xa, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x22, 0x24, 0x7b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x7d, 0x2e, 0x68, 0x22, 0xa, 0x60, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x72, 0x78, 0x2c, 0x20, 0x27, 0x5f, 0x27, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0xa, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x22, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0xa, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x6c, 0x65, 0x6e, 0x3b, 0xa, 0x60, 0x20, 0x20, 0x20, 0x20, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0xa, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x61, 0x72, 0x20, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5b, 0x5d, 0x3b, 0xa, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x61, 0x72, 0x20, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x65, 0x6e, 0x64, 0x5b, 0x5d, 0x3b, 0xa, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x65, 0x6e, 0x64, 0x20, 0x2d, 0x20, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x3b, 0xa, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x69, 0x62, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x60, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6c, 0x69, 0x62, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x72, 0x78, 0x2c, 0x20, 0x27, 0x5f, 0x27, 0x29, 0x7d, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x61, 0x72, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5b, 0x5d, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x61, 0x72, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x65, 0x6e, 0x64, 0x5b, 0x5d, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x27, 0x5c, 0x6e, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x22, 0x43, 0x22, 0x20, 0x7b, 0x5c, 0x6e, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x20, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x24, 0x7b, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x29, 0x7d, 0x28, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0x3b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x27, 0x7d, 0x5c, 0x6e, 0x27, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0xa, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x24, 0x7b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x7d, 0x3a, 0x3a, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x28, 0x22, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x7d, 0x22, 0x2c, 0x20, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x6c, 0x65, 0x6e, 0x29, 0x3b, 0xa, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x69, 0x62, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x60, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6c, 0x69, 0x62, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x72, 0x78, 0x2c, 0x20, 0x27, 0x5f, 0x27, 0x29, 0x7d, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x7d, 0x3a, 0x3a, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x28, 0x22, 0x24, 0x7b, 0x6c, 0x69, 0x62, 0x7d, 0x22, 0x2c, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x6c, 0x65, 0x6e, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0xa, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x24, 0x7b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x7d, 0x3a, 0x3a, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x28, 0x22, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x7d, 0x22, 0x2c, 0x20, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x65, 0x6e, 0x64, 0x20, 0x2d, 0x20, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x29, 0x3b, 0xa, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x69, 0x62, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x60, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6c, 0x69, 0x62, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x72, 0x78, 0x2c, 0x20, 0x27, 0x5f, 0x27, 0x29, 0x7d, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x7d, 0x3a, 0x3a, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x28, 0x22, 0x24, 0x7b, 0x6c, 0x69, 0x62, 0x7d, 0x22, 0x2c, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x65, 0x6e, 0x64, 0x20, 0x2d, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x7d, 0x3a, 0x3a, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x28, 0x22, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x22, 0x2c, 0x20, 0x26, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0x3b, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x27, 0x7d, 0x5c, 0x6e, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x26, 0x26, 0x20, 0x6c, 0x69, 0x62, 0x73, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x62, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x6c, 0x69, 0x62, 0x20, 0x3d, 0x3e, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x5b, 0x30, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x60, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6c, 0x69, 0x62, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x72, 0x78, 0x2c, 0x20, 0x27, 0x5f, 0x27, 0x29, 0x7d, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x2a, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x6a, 0x73, 0x20, 0x3d, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x3b, 0xa, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x6a, 0x73, 0x5f, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x65, 0x6e, 0x64, 0x20, 0x2d, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x3b, 0xa, 0x60, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x2a, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x6a, 0x73, 0x20, 0x3d, 0x20, 0x4e, 0x55, 0x4c, 0x4c, 0x3b, 0xa, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x6a, 0x73, 0x5f, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0xa, 0x60, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6a, 0x73, 0x5f, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x6c, 0x65, 0x6e, 0x3b, 0xa, 0x60, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x2a, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6a, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x3b, 0xa, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x2a, 0x20, 0x76, 0x38, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x22, 0x24, 0x7b, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x76, 0x38, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x7d, 0x22, 0x3b, 0xa, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x76, 0x38, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x24, 0x7b, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x76, 0x38, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3f, 0x20, 0x31, 0x20, 0x3a, 0x20, 0x30, 0x7d, 0x3b, 0xa, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x76, 0x38, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x24, 0x7b, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x76, 0x38, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x7d, 0x3b, 0xa, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x76, 0x38, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x20, 0x3d, 0x20, 0x24, 0x7b, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x76, 0x38, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x7d, 0x3b, 0xa, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x20, 0x3d, 0x20, 0x24, 0x7b, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x7d, 0x3b, 0xa, 0x60, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x65, 0x6e, 0x76, 0x20, 0x76, 0x61, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x76, 0x38, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x3a, 0x20, 0x30, 0x2c, 0xa, 0x20, 0x20, 0x76, 0x38, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x3a, 0x20, 0x32, 0x2c, 0xa, 0x20, 0x20, 0x76, 0x38, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x3a, 0x20, 0x27, 0x2d, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2d, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2d, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x3d, 0x31, 0x30, 0x20, 0x2d, 0x2d, 0x75, 0x73, 0x65, 0x2d, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x20, 0x2d, 0x2d, 0x74, 0x75, 0x72, 0x62, 0x6f, 0x2d, 0x66, 0x61, 0x73, 0x74, 0x2d, 0x61, 0x70, 0x69, 0x2d, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x20, 0x2d, 0x2d, 0x6e, 0x6f, 0x2d, 0x66, 0x72, 0x65, 0x65, 0x7a, 0x65, 0x2d, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x2d, 0x61, 0x66, 0x74, 0x65, 0x72, 0x2d, 0x69, 0x6e, 0x69, 0x74, 0x20, 0x2d, 0x2d, 0x63, 0x70, 0x70, 0x67, 0x63, 0x2d, 0x79, 0x6f, 0x75, 0x6e, 0x67, 0x2d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x2c, 0xa, 0x20, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x3a, 0x20, 0x30, 0x2c, 0xa, 0x20, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x3a, 0x20, 0x27, 0x27, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x3d, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x6f, 0x73, 0x3a, 0x20, 0x27, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x27, 0x2c, 0x20, 0xa, 0x20, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x3a, 0x20, 0x27, 0x6c, 0x6f, 0x27, 0x2c, 0xa, 0x20, 0x20, 0x43, 0x43, 0x3a, 0x20, 0x27, 0x67, 0x63, 0x63, 0x27, 0x2c, 0xa, 0x20, 0x20, 0x43, 0x58, 0x58, 0x3a, 0x20, 0x27, 0x67, 0x2b, 0x2b, 0x27, 0x2c, 0xa, 0x20, 0x20, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x20, 0x27, 0x78, 0x36, 0x34, 0x27, 0xa, 0x7d, 0xa, 0xa, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x6e, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x2d, 0x2d, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x31, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x2d, 0x2d, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x32, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x2d, 0x2d, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x27, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x32, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x28, 0x27, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6e, 0x65, 0x78, 0x74, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x2d, 0x2d, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x31, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x2d, 0x2d, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x32, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x65, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6e, 0x65, 0x78, 0x74, 0x29, 0x29, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x2d, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x31, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x2d, 0x2d, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x32, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x41, 0x72, 0x67, 0x73, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6e, 0x65, 0x78, 0x74, 0x29, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x20, 0x27, 0x29, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x30, 0x5d, 0x29, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0xa, 0x7d, 0xa, 0xa, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7b, 0x20, 0xa, 0x20, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x41, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x6c, 0x69, 0x62, 0x50, 0x61, 0x74, 0x68, 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2c, 0x20, 0x67, 0x65, 0x6e, 0xa, 0x7d, 0xa +}; +unsigned int _binary_lib_gen_js_len = 24548; + +const char _binary_lib_path_js_start[] = { +0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x43, 0x48, 0x41, 0x52, 0x5f, 0x46, 0x4f, 0x52, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x53, 0x4c, 0x41, 0x53, 0x48, 0x20, 0x3d, 0x20, 0x34, 0x37, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x43, 0x48, 0x41, 0x52, 0x5f, 0x42, 0x41, 0x43, 0x4b, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x53, 0x4c, 0x41, 0x53, 0x48, 0x20, 0x3d, 0x20, 0x39, 0x32, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x43, 0x48, 0x41, 0x52, 0x5f, 0x44, 0x4f, 0x54, 0x20, 0x3d, 0x20, 0x34, 0x36, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x30, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x27, 0x2f, 0x27, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x27, 0x2f, 0x27, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x27, 0x2e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x6f, 0x73, 0x20, 0x3c, 0x20, 0x30, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x70, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x31, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x50, 0x61, 0x74, 0x68, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x43, 0x48, 0x41, 0x52, 0x5f, 0x46, 0x4f, 0x52, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x53, 0x4c, 0x41, 0x53, 0x48, 0x20, 0x7c, 0x7c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x43, 0x48, 0x41, 0x52, 0x5f, 0x42, 0x41, 0x43, 0x4b, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x53, 0x4c, 0x41, 0x53, 0x48, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x41, 0x62, 0x6f, 0x76, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x2c, 0x20, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x20, 0x3d, 0x20, 0x2d, 0x31, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x64, 0x6f, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x20, 0x2b, 0x2b, 0x69, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x3c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x41, 0x74, 0x28, 0x69, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x73, 0x50, 0x61, 0x74, 0x68, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x43, 0x48, 0x41, 0x52, 0x5f, 0x46, 0x4f, 0x52, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x53, 0x4c, 0x41, 0x53, 0x48, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x73, 0x50, 0x61, 0x74, 0x68, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x69, 0x20, 0x2d, 0x20, 0x31, 0x20, 0x7c, 0x7c, 0x20, 0x64, 0x6f, 0x74, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x4e, 0x4f, 0x4f, 0x50, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x64, 0x6f, 0x74, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x32, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3c, 0x20, 0x32, 0x20, 0x7c, 0x7c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x32, 0x20, 0x7c, 0x7c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x41, 0x74, 0x28, 0x72, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x43, 0x48, 0x41, 0x52, 0x5f, 0x44, 0x4f, 0x54, 0x20, 0x7c, 0x7c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x41, 0x74, 0x28, 0x72, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2d, 0x20, 0x32, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x43, 0x48, 0x41, 0x52, 0x5f, 0x44, 0x4f, 0x54, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3e, 0x20, 0x32, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x2d, 0x31, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x30, 0x2c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2d, 0x20, 0x31, 0x20, 0x2d, 0x20, 0x72, 0x65, 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x20, 0x3d, 0x20, 0x69, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x20, 0x3d, 0x20, 0x69, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x41, 0x62, 0x6f, 0x76, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x20, 0x2b, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x3f, 0x20, 0x60, 0x24, 0x7b, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x7d, 0x2e, 0x2e, 0x60, 0x20, 0x3a, 0x20, 0x27, 0x2e, 0x2e, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x32, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x24, 0x7b, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x7d, 0x24, 0x7b, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x20, 0x2b, 0x20, 0x31, 0x2c, 0x20, 0x69, 0x29, 0x7d, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x20, 0x2b, 0x20, 0x31, 0x2c, 0x20, 0x69, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x69, 0x20, 0x2d, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x20, 0x2d, 0x20, 0x31, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x20, 0x3d, 0x20, 0x69, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x43, 0x48, 0x41, 0x52, 0x5f, 0x44, 0x4f, 0x54, 0x20, 0x26, 0x26, 0x20, 0x64, 0x6f, 0x74, 0x73, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x2d, 0x31, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2b, 0x2b, 0x64, 0x6f, 0x74, 0x73, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x2d, 0x31, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x73, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x2e, 0x27, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x73, 0x41, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x41, 0x74, 0x28, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x43, 0x48, 0x41, 0x52, 0x5f, 0x46, 0x4f, 0x52, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x53, 0x4c, 0x41, 0x53, 0x48, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x41, 0x74, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x43, 0x48, 0x41, 0x52, 0x5f, 0x46, 0x4f, 0x52, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x53, 0x4c, 0x41, 0x53, 0x48, 0xa, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x21, 0x69, 0x73, 0x41, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x2c, 0x20, 0x27, 0x2f, 0x27, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x73, 0x41, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x2f, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x70, 0x20, 0x3f, 0x20, 0x27, 0x2e, 0x2f, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x2e, 0x27, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x65, 0x70, 0x29, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x2b, 0x3d, 0x20, 0x27, 0x2f, 0x27, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x73, 0x41, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x20, 0x3f, 0x20, 0x60, 0x2f, 0x24, 0x7b, 0x70, 0x61, 0x74, 0x68, 0x7d, 0x60, 0x20, 0x3a, 0x20, 0x70, 0x61, 0x74, 0x68, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x20, 0x28, 0x2e, 0x2e, 0x2e, 0x61, 0x72, 0x67, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x2e, 0x27, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x32, 0x20, 0x26, 0x26, 0x20, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x31, 0x5d, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x2f, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x31, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0xa, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x20, 0x2b, 0x2b, 0x69, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x69, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x72, 0x67, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x2f, 0x24, 0x7b, 0x61, 0x72, 0x67, 0x7d, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x2e, 0x27, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7b, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x2c, 0x20, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x65, 0x78, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x7d, 0xa +}; +unsigned int _binary_lib_path_js_len = 3139; + +const char _binary_lib_proc_js_start[] = { +0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x2c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x7d, 0xa, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x30, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x70, 0x75, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0xa, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x70, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x2c, 0x20, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0xa, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x6d, 0x65, 0x6d, 0x20, 0x28, 0x73, 0x74, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x27, 0x20, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x20, 0x3c, 0x20, 0x32, 0x34, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2b, 0x2b, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x32, 0x33, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x73, 0x74, 0x72, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x69, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x34, 0x30, 0x39, 0x36, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x69, 0x20, 0x2b, 0x20, 0x31, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x75, 0x66, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x31, 0x30, 0x32, 0x34, 0x29, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x28, 0x29, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x60, 0x2f, 0x70, 0x72, 0x6f, 0x63, 0x2f, 0x73, 0x65, 0x6c, 0x66, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x60, 0x2c, 0x20, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x72, 0x65, 0x61, 0x64, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x62, 0x75, 0x66, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x31, 0x30, 0x32, 0x34, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x6d, 0x65, 0x6d, 0x28, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x62, 0x75, 0x66, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6d, 0x61, 0x63, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x27, 0x6d, 0x61, 0x63, 0x68, 0x27, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x2c, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x2c, 0x20, 0x4b, 0x45, 0x52, 0x4e, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x63, 0x68, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2f, 0x20, 0x34, 0x29, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2f, 0x20, 0x34, 0x29, 0x29, 0xa, 0x20, 0x20, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0xa, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x28, 0x29, 0x2c, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x2c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x4b, 0x45, 0x52, 0x4e, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x5b, 0x33, 0x5d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x77, 0x69, 0x6e, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x77, 0x69, 0x6e, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x42, 0x69, 0x67, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x39, 0x29, 0x29, 0xa, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5b, 0x32, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x77, 0x69, 0x6e, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x77, 0x69, 0x6e, 0xa, 0xa, 0x20, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x28, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x73, 0x5d, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x20, 0x27, 0x29, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6d, 0x61, 0x63, 0x27, 0x29, 0x20, 0x7b, 0xa, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x65, 0x2c, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x4b, 0x5f, 0x54, 0x43, 0x4b, 0x2c, 0x20, 0x73, 0x79, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x63, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x70, 0x74, 0x72, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0xa, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x62, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x3a, 0x20, 0x30, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x42, 0x69, 0x67, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x62, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x73, 0x74, 0x72, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x40, 0x74, 0x73, 0x2d, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x36, 0x34, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x28, 0x73, 0x74, 0x72, 0x2e, 0x70, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x3a, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x62, 0x36, 0x34, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0x29, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x20, 0x61, 0x72, 0x67, 0x62, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x54, 0x49, 0x4f, 0x43, 0x53, 0x43, 0x54, 0x54, 0x59, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x35, 0x34, 0x30, 0x45, 0xa, 0xa, 0x20, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x73, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x69, 0x6f, 0x63, 0x74, 0x6c, 0x32, 0x28, 0x30, 0x2c, 0x20, 0x54, 0x49, 0x4f, 0x43, 0x53, 0x43, 0x54, 0x54, 0x59, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x20, 0x24, 0x7b, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x60, 0x29, 0x29, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x28, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x70, 0x69, 0x64, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x73, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x28, 0x65, 0x6e, 0x76, 0x5b, 0x69, 0x5d, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x5b, 0x69, 0x5d, 0x5b, 0x31, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x20, 0x24, 0x7b, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x60, 0x29, 0x29, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x28, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x70, 0x69, 0x64, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x73, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x6e, 0x76, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x65, 0x6e, 0x76, 0x29, 0x2e, 0x61, 0x72, 0x67, 0x73, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x78, 0x65, 0x63, 0x76, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x65, 0x20, 0x24, 0x7b, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x60, 0x29, 0x29, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x28, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x70, 0x69, 0x64, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x28, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x4b, 0x5f, 0x54, 0x43, 0x4b, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x36, 0x29, 0x20, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x36, 0x29, 0x20, 0xa, 0x20, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x37, 0x29, 0x29, 0xa, 0xa, 0x20, 0x20, 0x63, 0x70, 0x75, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x5b, 0x34, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x28, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x2e, 0x70, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x35, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x5b, 0x69, 0x5d, 0x20, 0x2d, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x5b, 0x69, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0xa, 0xa, 0x7d, 0xa, 0xa, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7b, 0x20, 0x6d, 0x65, 0x6d, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x63, 0x70, 0x75, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x7d, 0xa +}; +unsigned int _binary_lib_proc_js_len = 4964; + +const char _binary_lib_stringify_js_start[] = { +0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x44, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x30, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x30, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x30, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x42, 0x6c, 0x61, 0x63, 0x6b, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x52, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x31, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x52, 0x65, 0x64, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x47, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x32, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x47, 0x72, 0x65, 0x65, 0x6e, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x59, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x33, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x59, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x42, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x34, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x42, 0x6c, 0x75, 0x65, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x4d, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x35, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x4d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x61, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x43, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x36, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x43, 0x79, 0x61, 0x6e, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x57, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x37, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x57, 0x68, 0x69, 0x74, 0x65, 0xa, 0xa, 0x2f, 0x2a, 0x2a, 0xa, 0x20, 0x2a, 0x20, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x72, 0x65, 0x74, 0x74, 0x79, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x4a, 0x53, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0xa, 0x20, 0x2a, 0x2f, 0xa, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x72, 0x20, 0x28, 0x6b, 0x2c, 0x20, 0x76, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x76, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x65, 0x6d, 0x6f, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x76, 0x29, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x76, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x76, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x69, 0x67, 0x69, 0x6e, 0x74, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x76, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x76, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x76, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x27, 0x20, 0x26, 0x26, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x76, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x3c, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x3e, 0x27, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x76, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x3a, 0x20, 0x76, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x27, 0x20, 0x2b, 0x20, 0x76, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x27, 0x20, 0x2b, 0x20, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x27, 0x20, 0x2b, 0x20, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x44, 0x61, 0x74, 0x61, 0x56, 0x69, 0x65, 0x77, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x44, 0x61, 0x74, 0x61, 0x56, 0x69, 0x65, 0x77, 0x20, 0x27, 0x20, 0x2b, 0x20, 0x76, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x24, 0x7b, 0x76, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x20, 0x28, 0x2e, 0x2e, 0x2e, 0x24, 0x7b, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x7d, 0x29, 0x60, 0x20, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x24, 0x7b, 0x76, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x20, 0x28, 0x2e, 0x2e, 0x2e, 0x24, 0x7b, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x7d, 0x29, 0x60, 0x20, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x2c, 0x20, 0x73, 0x70, 0x20, 0x3d, 0x20, 0x27, 0x20, 0x20, 0x27, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x6f, 0x2c, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x72, 0x2c, 0x20, 0x73, 0x70, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x74, 0x65, 0x78, 0x74, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x73, 0x7b, 0x38, 0x7d, 0x22, 0x28, 0x2e, 0x2b, 0x29, 0x22, 0x3a, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x7b, 0x41, 0x42, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x73, 0x7b, 0x36, 0x7d, 0x22, 0x28, 0x2e, 0x2b, 0x29, 0x22, 0x3a, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x7b, 0x41, 0x43, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x73, 0x7b, 0x34, 0x7d, 0x22, 0x28, 0x2e, 0x2b, 0x29, 0x22, 0x3a, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x20, 0x20, 0x20, 0x20, 0x24, 0x7b, 0x41, 0x47, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x73, 0x5c, 0x73, 0x22, 0x28, 0x2e, 0x2b, 0x29, 0x22, 0x3a, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x41, 0x59, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x28, 0x5b, 0x7b, 0x7d, 0x5d, 0x29, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x4d, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x5b, 0x28, 0x2e, 0x2b, 0x29, 0x5c, 0x5d, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x47, 0x7d, 0x5b, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x47, 0x7d, 0x5d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x22, 0x3c, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x3e, 0x22, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x43, 0x7d, 0x3c, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x3e, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x22, 0x3c, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x3e, 0x22, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x43, 0x7d, 0x3c, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x3e, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7b, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x20, 0x7d, 0xa +}; +unsigned int _binary_lib_stringify_js_len = 2000; + +const char _binary_lib_binary_js_start[] = { +0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x41, 0x44, 0x2c, 0x20, 0x41, 0x47, 0x2c, 0x20, 0x41, 0x43, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x75, 0x6d, 0x70, 0x20, 0x28, 0x75, 0x38, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x38, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x31, 0x36, 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x20, 0x3f, 0x20, 0x31, 0x30, 0x20, 0x3a, 0x20, 0x31, 0x36, 0xa, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x6c, 0x65, 0x6e, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x25, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x27, 0x27, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x60, 0x20, 0x24, 0x7b, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0x5c, 0x6e, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x6f, 0x66, 0x66, 0x20, 0x3d, 0x20, 0x69, 0x20, 0x2b, 0x20, 0x6f, 0x66, 0x66, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x25, 0x20, 0x38, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x60, 0x24, 0x7b, 0x41, 0x47, 0x7d, 0x24, 0x7b, 0x28, 0x62, 0x6f, 0x66, 0x66, 0x29, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x62, 0x61, 0x73, 0x65, 0x29, 0x2e, 0x70, 0x61, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x35, 0x2c, 0x20, 0x27, 0x20, 0x27, 0x29, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x60, 0x20, 0x24, 0x7b, 0x75, 0x38, 0x5b, 0x62, 0x6f, 0x66, 0x66, 0x5d, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x31, 0x36, 0x29, 0x2e, 0x70, 0x61, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x32, 0x2c, 0x20, 0x27, 0x30, 0x27, 0x29, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x38, 0x5b, 0x62, 0x6f, 0x66, 0x66, 0x5d, 0x20, 0x3e, 0x3d, 0x20, 0x33, 0x32, 0x20, 0x26, 0x26, 0x20, 0x75, 0x38, 0x5b, 0x62, 0x6f, 0x66, 0x66, 0x5d, 0x20, 0x3c, 0x3d, 0x20, 0x31, 0x32, 0x36, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x60, 0x24, 0x7b, 0x41, 0x43, 0x7d, 0x24, 0x7b, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x72, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x28, 0x75, 0x38, 0x5b, 0x62, 0x6f, 0x66, 0x66, 0x5d, 0x29, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x27, 0x2e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x2d, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x25, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x60, 0x20, 0x24, 0x7b, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0x5c, 0x6e, 0x60, 0x29, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x3c, 0x20, 0x38, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x60, 0x24, 0x7b, 0x27, 0x20, 0x20, 0x20, 0x27, 0x2e, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x28, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x29, 0x7d, 0x20, 0x24, 0x7b, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0x5c, 0x6e, 0x60, 0x29, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x60, 0x24, 0x7b, 0x27, 0x20, 0x20, 0x20, 0x27, 0x2e, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x28, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x29, 0x7d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x7b, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0x5c, 0x6e, 0x60, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7b, 0x20, 0x64, 0x75, 0x6d, 0x70, 0x20, 0x7d, 0xa +}; +unsigned int _binary_lib_binary_js_len = 1074; + diff --git a/lib/asm/arm64.js b/lib/asm/arm64.js index 38b0a53..637a31b 100644 --- a/lib/asm/arm64.js +++ b/lib/asm/arm64.js @@ -781,6 +781,14 @@ class Assembler { return new Uint8Array(this.#codes.flat()) } + get size () { + let len = 0 + for (const code of this.#codes) { + len += code.length + } + return len + } + get src () { const { codes, instr } = this return instr.map((v, i) => [`# ${codes[i].reverse().map(v => '0x' + v.toString(16))}`, v]).flat().join('\n') + '\n' diff --git a/lib/asm/compiler.js b/lib/asm/compiler.js index 765274f..a66249b 100644 --- a/lib/asm/compiler.js +++ b/lib/asm/compiler.js @@ -1,7 +1,7 @@ const { assert, addr, ptr, core } = lo const { - mprotect, memcpy, mmap, + mprotect, memcpy, mmap, aligned_alloc, PROT_READ, MAP_PRIVATE, PROT_WRITE, PROT_EXEC, MAP_ANONYMOUS } = core @@ -27,8 +27,13 @@ class Compiler { const address = mmap(0, code.length, PROT_WRITE, flags, -1, u32) assert(address) - assert(memcpy(address, code.ptr, code.length) === address) - assert(mprotect(address, code.length, PROT_EXEC | PROT_READ) === 0) + try { + assert(memcpy(address, code.ptr, code.length) === address) + assert(mprotect(address, code.length, PROT_EXEC | PROT_READ) === 0) + } catch (err) { + munmap(address) + throw err + } return address } } diff --git a/lib/asm/x64.js b/lib/asm/x64.js index ca985cc..12c5f50 100644 --- a/lib/asm/x64.js +++ b/lib/asm/x64.js @@ -105,6 +105,9 @@ const op_cmp = 0x3d const op_je8 = 0x74 const op_je32 = [0x0f, 0x84] +const op_jne8 = 0x75 +const op_jne32 = [0x0f, 0x85] + const op_jmp8 = 0xeb const op_jmp32 = 0xe9 @@ -247,6 +250,15 @@ class Assembler { return this } + test (rega, regb) { + this.#instr.push(`test %${rega}, %${regb}`) + if (rega === 'rax' && regb === 'rax') { + //this.#codes.push([0x48, 0x85, 0xc0]) + this.#codes.push([0x85, 0xc0]) + } + return this + } + // url: https://www.felixcloutier.com/x86/push // OpCode: 50 +rd // Instruction: PUSH r64 @@ -305,6 +317,16 @@ class Assembler { return this } + callr (address) { + // OpCode: E8 cd + // Instruction: call rel32 + // Op/En: D + // 1: 32 bit offset + this.#instr.push(`call ${address}`) + this.#codes.push([0xe8, ...as_four_bytes(address)]) + return this + } + // url: https://www.felixcloutier.com/x86/jmp jmp (address, reg = 'rax') { // OpCode: FF /4 @@ -315,13 +337,6 @@ class Assembler { return this } - // url: https://www.felixcloutier.com/x86/jmp - jmpl (label, reg = 'rax') { - this.#instr.push(`jmp :${label}`) - this.#codes.push([]) - return this - } - // url: https://www.felixcloutier.com/x86/mov movabs (address, reg) { // OpCode: REX.W + B8+ rd io @@ -380,12 +395,25 @@ class Assembler { return this } + // url: https://www.felixcloutier.com/x86/jmp + jmpl (label, reg = 'rax') { + this.#instr.push(`jmp :${label}`) + this.#codes.push([]) + return this + } + jel (label) { this.#instr.push(`jel :${label}`) this.#codes.push([]) return this } + jne (label) { + this.#instr.push(`jne :${label}`) + this.#codes.push([]) + return this + } + label (name) { const end = this.#codes.flat().length let start = 0 @@ -400,7 +428,15 @@ class Assembler { } else { this.#codes[i] = [...op_je32, ...as_four_bytes(distance)] } - this.#instr[i] = `je :${distance}` + this.#instr[i] = `jel ${distance}` + } else if (instr === `jne :${name}`) { + const distance = end - start + if (distance < pow8) { + this.#codes[i] = [op_jne8, distance] + } else { + this.#codes[i] = [...op_jne32, ...as_four_bytes(distance)] + } + this.#instr[i] = `jne ${distance}` } else if (instr === `jmp :${name}`) { const distance = end - start if (distance < pow8) { @@ -408,7 +444,7 @@ class Assembler { } else { this.#codes[i] = [op_jmp32, ...as_four_bytes(distance)] } - this.#instr[i] = `jmp :${distance}` + this.#instr[i] = `jmp ${distance}` } } return this @@ -499,6 +535,20 @@ class Assembler { return this } + nop () { + this.#instr.push('nop') + this.#codes.push([0x90]) + return this + } + + pad () { + const extra = this.size % 16 + if (extra) { + let padding = 16 - extra + while (padding--) this.nop() + } + } + syscall () { this.#instr.push('syscall') this.#codes.push([0x0f, 0x05]) @@ -515,6 +565,14 @@ class Assembler { return new Uint8Array(this.#codes.flat()) } + get size () { + let len = 0 + for (const code of this.#codes) { + len += code.length + } + return len + } + get src () { const { codes, instr } = this return instr.map((v, i) => [`# ${codes[i].map(v => '0x' + v.toString(16))}`, v]).flat().join('\n') + '\n' diff --git a/lib/boringssl/api.js b/lib/boringssl/api.js index 1177aea..8941d1c 100644 --- a/lib/boringssl/api.js +++ b/lib/boringssl/api.js @@ -582,8 +582,8 @@ const includes = [ const libs = [] const obj = [ - 'deps/boringssl/build/ssl/libssl.a', - 'deps/boringssl/build/crypto/libcrypto.a' + 'deps/boringssl/build/libssl.a', + 'deps/boringssl/build/libcrypto.a' ] const include_paths = ['./deps/boringssl/include'] const lib_paths = [] diff --git a/lib/boringssl/build.js b/lib/boringssl/build.js index 17aca61..0bac95e 100644 --- a/lib/boringssl/build.js +++ b/lib/boringssl/build.js @@ -15,7 +15,7 @@ async function build () { assert(chdir('deps') === 0) if (!isFile('boringssl.tar.gz')) { console.log('fetching release') - fetch('https://codeload.github.com/google/boringssl/tar.gz/master', + fetch('https://codeload.github.com/google/boringssl/tar.gz/main', 'boringssl.tar.gz') } const bytes = readFile('boringssl.tar.gz') diff --git a/lib/core/api.js b/lib/core/api.js index ebdf5fb..50c14cb 100644 --- a/lib/core/api.js +++ b/lib/core/api.js @@ -293,6 +293,22 @@ const api = { parameters: [], result: 'i32' }, + getsid: { + parameters: ['i32'], + result: 'i32' + }, + setsid: { + parameters: [], + result: 'i32' + }, + getpgrp: { + parameters: [], + result: 'i32' + }, + setpgid: { + parameters: ['i32', 'i32'], + result: 'i32' + }, fork: { parameters: [], result: 'i32' @@ -734,8 +750,9 @@ const constants = { S_IFBLK: 'i32', S_IFCHR: 'i32', S_IFIFO: 'i32', S_IRUSR: 'i32', S_IWUSR: 'i32', S_IRGRP: 'i32', S_IWGRP: 'i32', S_IROTH: 'i32', S_IWOTH: 'i32', O_RDONLY: 'i32', O_WRONLY: 'i32', - O_CREAT: 'i32', S_IRWXU: 'i32', S_IRWXG: 'i32', S_IXOTH: 'i32', - O_TRUNC: 'i32', STDIN: 0, STDOUT: 1, STDERR: 2, O_CLOEXEC: 'i32', + O_CREAT: 'i32', S_IXOTH: 'i32', + S_IXUSR: 'i32', S_IXGRP: 'i32', S_IRWXU: 'i32', S_IRWXG: 'i32', + O_TRUNC: 'i32', STDIN: 0, STDOUT: 1, STDERR: 2, O_CLOEXEC: 'i32', RUSAGE_SELF: 'i32', SEEK_SET: 'i32', SEEK_CUR: 'i32', SEEK_END: 'i32', S_IRWXO: 'i32', F_OK: 'i32', S_IFMT: 'i32', S_IFDIR: 'i32', S_IFREG: 'i32', NAME_MAX: 'u32', O_RDWR: 'i32', O_SYNC: 'i32', @@ -760,7 +777,7 @@ const constants = { DT_UNKNOWN: 'i32', } -const structs = ['clock_t', 'fastcall'] +const structs = ['clock_t', 'fastcall', 'struct stat', 'struct timespec', 'dev_t', 'ino_t', 'mode_t', 'nlink_t', 'uid_t', 'gid_t', 'off_t', 'blksize_t', 'blkcnt_t'] // list of headers to include const includes = [ @@ -801,9 +818,15 @@ const linux = { 'linux/reboot.h', 'sys/ioctl.h', 'dirent.h', - 'sched.h' + 'sched.h', + 'sys/sysmacros.h' ], api: { + makedev: { + parameters: ['u32', 'u32'], + result: 'u32', + name: 'gnu_dev_makedev' + }, posix_fadvise: { parameters: ['i32', 'u32', 'u32', 'i32'], result: 'i32' diff --git a/lib/core/core.cc b/lib/core/core.cc index 8a08935..a7552d9 100644 --- a/lib/core/core.cc +++ b/lib/core/core.cc @@ -35,6 +35,7 @@ #include #include #include +#include #endif @@ -947,6 +948,43 @@ CTypeInfo rcgetpid = CTypeInfo(CTypeInfo::Type::kInt32); CFunctionInfo infogetpid = CFunctionInfo(rcgetpid, 1, cargsgetpid); CFunction pFgetpid = CFunction((const void*)&getpidFast, &infogetpid); +int32_t getsidFast(void* p, int32_t p0); +CTypeInfo cargsgetsid[2] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcgetsid = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infogetsid = CFunctionInfo(rcgetsid, 2, cargsgetsid); +CFunction pFgetsid = CFunction((const void*)&getsidFast, &infogetsid); + +int32_t setsidFast(void* p); +CTypeInfo cargssetsid[1] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + +}; +CTypeInfo rcsetsid = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infosetsid = CFunctionInfo(rcsetsid, 1, cargssetsid); +CFunction pFsetsid = CFunction((const void*)&setsidFast, &infosetsid); + +int32_t getpgrpFast(void* p); +CTypeInfo cargsgetpgrp[1] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + +}; +CTypeInfo rcgetpgrp = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infogetpgrp = CFunctionInfo(rcgetpgrp, 1, cargsgetpgrp); +CFunction pFgetpgrp = CFunction((const void*)&getpgrpFast, &infogetpgrp); + +int32_t setpgidFast(void* p, int32_t p0, int32_t p1); +CTypeInfo cargssetpgid[3] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcsetpgid = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infosetpgid = CFunctionInfo(rcsetpgid, 3, cargssetpgid); +CFunction pFsetpgid = CFunction((const void*)&setpgidFast, &infosetpgid); + int32_t forkFast(void* p); CTypeInfo cargsfork[1] = { CTypeInfo(CTypeInfo::Type::kV8Value), @@ -1136,6 +1174,16 @@ CFunction pFsync = CFunction((const void*)&syncFast, &infosync); #ifdef __linux__ +uint32_t makedevFast(void* p, uint32_t p0, uint32_t p1); +CTypeInfo cargsmakedev[3] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kUint32), +}; +CTypeInfo rcmakedev = CTypeInfo(CTypeInfo::Type::kUint32); +CFunctionInfo infomakedev = CFunctionInfo(rcmakedev, 3, cargsmakedev); +CFunction pFmakedev = CFunction((const void*)&makedevFast, &infomakedev); + int32_t posix_fadviseFast(void* p, int32_t p0, uint32_t p1, uint32_t p2, int32_t p3); CTypeInfo cargsposix_fadvise[5] = { CTypeInfo(CTypeInfo::Type::kV8Value), @@ -2052,6 +2100,48 @@ int32_t getpidFast(void* p) { return getpid(); } +void getsidSlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + int32_t rc = getsid(v0); + args.GetReturnValue().Set(rc); +} + +int32_t getsidFast(void* p, int32_t p0) { + int32_t v0 = p0; + return getsid(v0); +} +void setsidSlow(const FunctionCallbackInfo &args) { + + int32_t rc = setsid(); + args.GetReturnValue().Set(rc); +} + +int32_t setsidFast(void* p) { + + return setsid(); +} +void getpgrpSlow(const FunctionCallbackInfo &args) { + + int32_t rc = getpgrp(); + args.GetReturnValue().Set(rc); +} + +int32_t getpgrpFast(void* p) { + + return getpgrp(); +} +void setpgidSlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + int32_t v1 = Local::Cast(args[1])->Value(); + int32_t rc = setpgid(v0, v1); + args.GetReturnValue().Set(rc); +} + +int32_t setpgidFast(void* p, int32_t p0, int32_t p1) { + int32_t v0 = p0; + int32_t v1 = p1; + return setpgid(v0, v1); +} void forkSlow(const FunctionCallbackInfo &args) { int32_t rc = fork(); @@ -2332,6 +2422,18 @@ void syncFast(void* p) { } #ifdef __linux__ +void makedevSlow(const FunctionCallbackInfo &args) { + uint32_t v0 = Local::Cast(args[0])->Value(); + uint32_t v1 = Local::Cast(args[1])->Value(); + uint32_t rc = gnu_dev_makedev(v0, v1); + args.GetReturnValue().Set(rc); +} + +uint32_t makedevFast(void* p, uint32_t p0, uint32_t p1) { + uint32_t v0 = p0; + uint32_t v1 = p1; + return gnu_dev_makedev(v0, v1); +} void posix_fadviseSlow(const FunctionCallbackInfo &args) { int32_t v0 = Local::Cast(args[0])->Value(); uint32_t v1 = Local::Cast(args[1])->Value(); @@ -2603,6 +2705,10 @@ void Init(Isolate* isolate, Local target) { SET_FAST_METHOD(isolate, module, "dup2", &pFdup2, dup2Slow); SET_FAST_METHOD(isolate, module, "getcwd", &pFgetcwd, getcwdSlow); SET_FAST_METHOD(isolate, module, "getpid", &pFgetpid, getpidSlow); + SET_FAST_METHOD(isolate, module, "getsid", &pFgetsid, getsidSlow); + SET_FAST_METHOD(isolate, module, "setsid", &pFsetsid, setsidSlow); + SET_FAST_METHOD(isolate, module, "getpgrp", &pFgetpgrp, getpgrpSlow); + SET_FAST_METHOD(isolate, module, "setpgid", &pFsetpgid, setpgidSlow); SET_FAST_METHOD(isolate, module, "fork", &pFfork, forkSlow); SET_FAST_METHOD(isolate, module, "kill", &pFkill, killSlow); SET_FAST_METHOD(isolate, module, "waitpid", &pFwaitpid, waitpidSlow); @@ -2628,6 +2734,7 @@ void Init(Isolate* isolate, Local target) { SET_FAST_METHOD(isolate, module, "sync", &pFsync, syncSlow); #ifdef __linux__ + SET_FAST_METHOD(isolate, module, "makedev", &pFmakedev, makedevSlow); SET_FAST_METHOD(isolate, module, "posix_fadvise", &pFposix_fadvise, posix_fadviseSlow); SET_FAST_METHOD(isolate, module, "ioctl", &pFioctl, ioctlSlow); SET_FAST_METHOD(isolate, module, "ioctl2", &pFioctl2, ioctl2Slow); @@ -2660,9 +2767,11 @@ void Init(Isolate* isolate, Local target) { SET_VALUE(isolate, module, "O_RDONLY", Integer::New(isolate, (int32_t)O_RDONLY)); SET_VALUE(isolate, module, "O_WRONLY", Integer::New(isolate, (int32_t)O_WRONLY)); SET_VALUE(isolate, module, "O_CREAT", Integer::New(isolate, (int32_t)O_CREAT)); + SET_VALUE(isolate, module, "S_IXOTH", Integer::New(isolate, (int32_t)S_IXOTH)); + SET_VALUE(isolate, module, "S_IXUSR", Integer::New(isolate, (int32_t)S_IXUSR)); + SET_VALUE(isolate, module, "S_IXGRP", Integer::New(isolate, (int32_t)S_IXGRP)); SET_VALUE(isolate, module, "S_IRWXU", Integer::New(isolate, (int32_t)S_IRWXU)); SET_VALUE(isolate, module, "S_IRWXG", Integer::New(isolate, (int32_t)S_IRWXG)); - SET_VALUE(isolate, module, "S_IXOTH", Integer::New(isolate, (int32_t)S_IXOTH)); SET_VALUE(isolate, module, "O_TRUNC", Integer::New(isolate, (int32_t)O_TRUNC)); SET_VALUE(isolate, module, "STDIN", Number::New(isolate, (int64_t)0)); SET_VALUE(isolate, module, "STDOUT", Number::New(isolate, (int64_t)1)); @@ -2744,11 +2853,33 @@ void Init(Isolate* isolate, Local target) { #ifdef __MACH__ SET_VALUE(isolate, module, "struct_clock_t_size", Integer::New(isolate, sizeof(clock_t))); SET_VALUE(isolate, module, "struct_fastcall_size", Integer::New(isolate, sizeof(fastcall))); + SET_VALUE(isolate, module, "struct_struct_stat_size", Integer::New(isolate, sizeof(struct stat))); + SET_VALUE(isolate, module, "struct_struct_timespec_size", Integer::New(isolate, sizeof(struct timespec))); + SET_VALUE(isolate, module, "struct_dev_t_size", Integer::New(isolate, sizeof(dev_t))); + SET_VALUE(isolate, module, "struct_ino_t_size", Integer::New(isolate, sizeof(ino_t))); + SET_VALUE(isolate, module, "struct_mode_t_size", Integer::New(isolate, sizeof(mode_t))); + SET_VALUE(isolate, module, "struct_nlink_t_size", Integer::New(isolate, sizeof(nlink_t))); + SET_VALUE(isolate, module, "struct_uid_t_size", Integer::New(isolate, sizeof(uid_t))); + SET_VALUE(isolate, module, "struct_gid_t_size", Integer::New(isolate, sizeof(gid_t))); + SET_VALUE(isolate, module, "struct_off_t_size", Integer::New(isolate, sizeof(off_t))); + SET_VALUE(isolate, module, "struct_blksize_t_size", Integer::New(isolate, sizeof(blksize_t))); + SET_VALUE(isolate, module, "struct_blkcnt_t_size", Integer::New(isolate, sizeof(blkcnt_t))); #endif #ifdef __linux__ SET_VALUE(isolate, module, "struct_clock_t_size", Integer::New(isolate, sizeof(clock_t))); SET_VALUE(isolate, module, "struct_fastcall_size", Integer::New(isolate, sizeof(fastcall))); + SET_VALUE(isolate, module, "struct_struct_stat_size", Integer::New(isolate, sizeof(struct stat))); + SET_VALUE(isolate, module, "struct_struct_timespec_size", Integer::New(isolate, sizeof(struct timespec))); + SET_VALUE(isolate, module, "struct_dev_t_size", Integer::New(isolate, sizeof(dev_t))); + SET_VALUE(isolate, module, "struct_ino_t_size", Integer::New(isolate, sizeof(ino_t))); + SET_VALUE(isolate, module, "struct_mode_t_size", Integer::New(isolate, sizeof(mode_t))); + SET_VALUE(isolate, module, "struct_nlink_t_size", Integer::New(isolate, sizeof(nlink_t))); + SET_VALUE(isolate, module, "struct_uid_t_size", Integer::New(isolate, sizeof(uid_t))); + SET_VALUE(isolate, module, "struct_gid_t_size", Integer::New(isolate, sizeof(gid_t))); + SET_VALUE(isolate, module, "struct_off_t_size", Integer::New(isolate, sizeof(off_t))); + SET_VALUE(isolate, module, "struct_blksize_t_size", Integer::New(isolate, sizeof(blksize_t))); + SET_VALUE(isolate, module, "struct_blkcnt_t_size", Integer::New(isolate, sizeof(blkcnt_t))); SET_VALUE(isolate, module, "struct_cpu_set_t_size", Integer::New(isolate, sizeof(cpu_set_t))); #endif diff --git a/lib/core2/api.js b/lib/core2/api.js new file mode 100644 index 0000000..dcf6f1c --- /dev/null +++ b/lib/core2/api.js @@ -0,0 +1,492 @@ +const api = { + calloc: { + parameters: ['u32', 'u32'], + result: 'pointer' + }, + read: { + parameters: ['i32', 'pointer', 'i32'], + result: 'i32', + name: '_read' + }, + write: { + parameters: ['i32', 'pointer', 'i32'], + result: 'i32', + name: '_write' + }, + write_string: { + parameters: ['i32', 'string', 'i32'], + pointers: [, 'const char*'], + override: [, , { param: 1, fastfield: '->length', slowfield: '.length()' }], + result: 'i32', + name: '_write' + }, + putchar: { + parameters: ['i32'], + result: 'i32' + }, + getchar: { + parameters: [], + result: 'i32' + }, + close: { + parameters: ['i32'], + result: 'i32', + name: '_close' + }, + lseek: { + parameters: ['i32', 'u32', 'i32'], + result: 'u32', + name: '_lseek' + }, + // https://github.com/wine-mirror/wine/blob/master/include/msvcrt/sys/stat.h#L52 + fstat: { + parameters: ['i32', 'pointer'], + pointers: [, 'struct _stat *'], + result: 'i32', + name: '_fstat' + }, + rename: { + parameters: ['string', 'string'], + result: 'i32' + }, + open: { + parameters: ['string', 'i32', 'i32'], + pointers: ['const char*'], + result: 'i32', + name: '_open' + }, + unlink: { + parameters: ['string'], + result: 'i32', + name: '_unlink' + }, + memcpy: { + parameters: ['pointer', 'pointer', 'u32'], + result: 'pointer' + }, + memset: { + parameters: ['pointer', 'i32', 'u32'], + result: 'pointer' + }, + memmove: { + parameters: ['pointer', 'pointer', 'u32'], + result: 'pointer' + }, + malloc: { + parameters: ['u32'], + result: 'pointer' + }, + realloc: { + parameters: ['pointer', 'u32'], + result: 'pointer' + }, + aligned_alloc: { + parameters: ['u32', 'u32'], + result: 'pointer', + name: '_aligned_malloc' + }, + free: { + parameters: ['pointer'], + result: 'void' + }, + bind_fastcall: { + declare_only: true, + nofast: true + }, + bind_slowcall: { + declare_only: true, + nofast: true + }, + fastcall: { + parameters: ['pointer'], + pointers: ['struct fastcall*'], + result: 'void', + name: 'lo_fastcall' + }, + getenv: { + parameters: ['string'], + pointers: ['const char*'], + rpointer: 'char*', + result: 'pointer' + }, + dup: { + parameters: ['i32'], + result: 'i32', + name: '_dup' + }, + dup2: { + parameters: ['i32', 'i32'], + result: 'i32', + name: '_dup2' + }, + getcwd: { + parameters: ['pointer', 'i32'], + pointers: ['char*'], + result: 'pointer', + name: '_getcwd' + }, + getpid: { + parameters: [], + result: 'i32', + name: '_getpid' + }, + execve: { + parameters: ['string', 'buffer', 'buffer'], + pointers: ['const char*', 'char* const*', 'char* const*'], + result: 'i32', + name: '_execve' + }, + execvp: { + parameters: ['string', 'buffer'], + pointers: ['const char*', 'char* const*'], + result: 'i32', + name: '_execvp' + }, + exit: { + parameters: ['i32'], + result: 'void' + }, + isolate_create: { + parameters: [ + 'i32', 'u32array', 'string', 'u32', 'string', 'u32', 'buffer', + 'i32', 'i32', 'u64', 'string', 'string', 'i32', 'i32', 'pointer' + ], + pointers: [ + , 'char**', 'const char*', , 'const char*', , 'char*', , , + 'const char*', 'const char*' + ], + result: 'i32', + name: 'lo_create_isolate', + jsdoc: ``, + nofast: true + }, + isolate_context_create: { + parameters: [ + 'i32', 'pointer', 'string', 'u32', 'string', 'u32', 'pointer', + 'i32', 'i32', 'u64', 'string', 'string', 'i32', 'i32', 'pointer', 'buffer' + ], + pointers: [ + , 'char**', 'const char*', , 'const char*', , 'char*', , , + 'const char*', 'const char*', , , , , 'struct isolate_context*' + ], + result: 'void', + name: 'lo_create_isolate_context', + nofast: true + }, + isolate_context_destroy: { + parameters: ['buffer'], + pointers: ['struct isolate_context*'], + result: 'void', + name: 'lo_destroy_isolate_context' + }, + isolate_context_size: { + parameters: [], + result: 'i32', + name: 'lo_context_size' + }, + isolate_start: { + parameters: ['buffer'], + result: 'void', + name: 'lo_start_isolate', + nofast: true + }, + callback: { + parameters: ['pointer'], + pointers: ['exec_info*'], + result: 'void', + name: 'lo_callback', + nofast: true + }, + strnlen: { + parameters: ['pointer', 'u32'], + pointers: ['const char*'], + result: 'u32' + }, + isatty: { + parameters: ['i32'], + result: 'i32', + name: '_isatty' + }, +} + +const preamble = ` +#ifdef _WIN32 +#define strdup _strdup +#endif + + +struct fastcall { + void* wrapper; // 0-7 : v8 fastcall wrapper function pointer + uint8_t result; // 8 : the type of the result + uint8_t nparam; // 9 : the number of args (max 255) + uint8_t param[30]; // 10-39 : an array of types of the arguments + uint64_t args[32]; // 40-295: an array of pointer slots for arguments + // these will be filled in dynamically by + // lo::core::SlowCallback for the slow call + // and then the slowcall wrapper will shift them from + // this structure into regs + stack and make the call + // the first slot is reserved for the result + void* fn; // 296-303: the slowcall wrapper function pointer +}; + +typedef void (*lo_fast_call)(void*); + +inline uint8_t needsunwrap (lo::FastTypes t) { + if (t == lo::FastTypes::buffer) return 1; + if (t == lo::FastTypes::u32array) return 1; + if (t == lo::FastTypes::pointer) return 1; + if (t == lo::FastTypes::u64) return 1; + if (t == lo::FastTypes::i64) return 1; + return 0; +} + +v8::CTypeInfo* CTypeFromV8 (uint8_t v8Type) { + if (v8Type == lo::FastTypes::boolean) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kBool); + if (v8Type == lo::FastTypes::i8) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt32); + if (v8Type == lo::FastTypes::i16) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt32); + if (v8Type == lo::FastTypes::i32) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt32); + if (v8Type == lo::FastTypes::u8) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint32); + if (v8Type == lo::FastTypes::u16) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint32); + if (v8Type == lo::FastTypes::u32) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint32); + if (v8Type == lo::FastTypes::f32) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kFloat32); + if (v8Type == lo::FastTypes::f64) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kFloat64); + if (v8Type == lo::FastTypes::i64) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt64); + if (v8Type == lo::FastTypes::u64) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + if (v8Type == lo::FastTypes::iSize) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt64); + if (v8Type == lo::FastTypes::uSize) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + if (v8Type == lo::FastTypes::pointer) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + if (v8Type == lo::FastTypes::function) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + if (v8Type == lo::FastTypes::string) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kSeqOneByteString); + if (v8Type == lo::FastTypes::buffer) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + if (v8Type == lo::FastTypes::u32array) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + return new v8::CTypeInfo(v8::CTypeInfo::Type::kVoid); +} + +void lo_fastcall (struct fastcall* state) { + ((lo_fast_call)state->fn)(&state->args); +} + +void SlowCallback(const FunctionCallbackInfo &args) { + Isolate* isolate = args.GetIsolate(); + HandleScope scope(isolate); + struct fastcall* state = (struct fastcall*)args.Data() + .As()->GetAlignedPointerFromInternalField(1); + int r = 1; + int s = 0; + char* temp_strs[100]; + for (int i = 0; i < state->nparam; i++) { + switch (state->param[i]) { + case FastTypes::string: + { + String::Utf8Value arg0(isolate, args[i]); + temp_strs[s] = strdup(*arg0); + state->args[r++] = (uint64_t)temp_strs[s++]; + } + break; + case FastTypes::u32: + state->args[r++] = (uint32_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::u16: + state->args[r++] = (uint16_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::u8: + state->args[r++] = (uint8_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::boolean: + state->args[r++] = (bool)Local::Cast(args[i])->Value(); + break; + case FastTypes::i32: + state->args[r++] = (int32_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::i16: + state->args[r++] = (int16_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::i8: + state->args[r++] = (int8_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::i64: + case FastTypes::iSize: + state->args[r++] = (int64_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::u64: + case FastTypes::pointer: + case FastTypes::uSize: + state->args[r++] = (uint64_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::buffer: + { + Local u8 = args[i].As(); + state->args[r++] = (uint64_t)((uint8_t*)u8->Buffer()->Data() + + u8->ByteOffset()); + } + break; + case FastTypes::u32array: + { + Local u32 = args[i].As(); + state->args[r++] = (uint64_t)((uint8_t*)u32->Buffer()->Data() + + u32->ByteOffset()); + } + break; + case FastTypes::function: + break; + case FastTypes::f32: + { + float src = (float)args[i].As()->Value(); + float* dst = (float*)&state->args[r++]; + *dst = src; + } + break; + case FastTypes::f64: + { + double src = (double)args[i].As()->Value(); + double* dst = (double*)&state->args[r++]; + *dst = src; + } + break; + } + } + lo_fastcall(state); + for (int i = 0; i < s; i++) { + free(temp_strs[i]); + } + switch (state->result) { + case FastTypes::i32: + args.GetReturnValue().Set((int32_t)state->args[0]); + break; + case FastTypes::u32: + args.GetReturnValue().Set((uint32_t)state->args[0]); + break; + case FastTypes::boolean: + args.GetReturnValue().Set((bool)state->args[0]); + break; + case FastTypes::f32: + { + float* dst = (float*)&state->args[0]; + args.GetReturnValue().Set(Number::New(isolate, *dst)); + } + break; + case FastTypes::f64: + { + double* dst = (double*)&state->args[0]; + args.GetReturnValue().Set(Number::New(isolate, *dst)); + } + break; + case FastTypes::i64: + { + int64_t* res = reinterpret_cast((uint64_t)Local::Cast(args[args.Length() - 1])->Value()); + *res = state->args[0]; + } + break; + case FastTypes::buffer: + case FastTypes::u32array: + case FastTypes::u64: + case FastTypes::pointer: + { + uint64_t* res = reinterpret_cast((uint64_t)Local::Cast(args[args.Length() - 1])->Value()); + *res = state->args[0]; + } + break; + } +} + +void bind_fastcallSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + Local context = isolate->GetCurrentContext(); + // TODO - does integer work? + struct fastcall* state = reinterpret_cast( + Local::Cast(args[0])->Value()); + Local tpl = ObjectTemplate::New(isolate); + tpl->SetInternalFieldCount(2); + Local data = tpl->NewInstance(context).ToLocalChecked(); + data->SetAlignedPointerInInternalField(1, state); + uint8_t unwrap = needsunwrap((FastTypes)state->result); + int fastlen = state->nparam + 1 + unwrap; + CTypeInfo* cargs = (CTypeInfo*)calloc(fastlen, sizeof(CTypeInfo)); + cargs[0] = CTypeInfo(CTypeInfo::Type::kV8Value); + for (int i = 0; i < state->nparam; i++) { + uint8_t ptype = state->param[i]; + cargs[i + 1] = *CTypeFromV8(ptype); + } + CTypeInfo* rc; + if (unwrap) { + cargs[fastlen - 1] = *CTypeFromV8(FastTypes::u32array); + rc = CTypeFromV8(FastTypes::empty); + } else { + rc = CTypeFromV8((FastTypes)state->result); + } + CFunctionInfo* info = new CFunctionInfo(*rc, fastlen, cargs); + CFunction* fastCFunc = new CFunction(state->wrapper, info); + Local funcTemplate = FunctionTemplate::New(isolate, + SlowCallback, data, Local(), 0, v8::ConstructorBehavior::kThrow, + v8::SideEffectType::kHasNoSideEffect, fastCFunc + ); + Local fun = + funcTemplate->GetFunction(context).ToLocalChecked(); + args.GetReturnValue().Set(fun); +} + +void bind_slowcallSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + Local context = isolate->GetCurrentContext(); + struct fastcall* state = reinterpret_cast( + Local::Cast(args[0])->Value()); + Local tpl = ObjectTemplate::New(isolate); + tpl->SetInternalFieldCount(2); + Local data = tpl->NewInstance(context).ToLocalChecked(); + data->SetAlignedPointerInInternalField(1, state); + Local funcTemplate = FunctionTemplate::New(isolate, + SlowCallback, data, Local(), 0, v8::ConstructorBehavior::kThrow, + v8::SideEffectType::kHasNoSideEffect, 0 + ); + Local fun = + funcTemplate->GetFunction(context).ToLocalChecked(); + args.GetReturnValue().Set(fun); +} +` +const includes = ['io.h', 'direct.h', 'process.h'] +const name = 'core' +const libs = [] +const obj = [] +const constants = { + S_IFCHR: 'i32', O_RDONLY: 'i32', O_WRONLY: 'i32', O_CREAT: 'i32', + O_TRUNC: 'i32', STDIN: 0, STDOUT: 1, STDERR: 2, SEEK_SET: 'i32', + SEEK_CUR: 'i32', SEEK_END: 'i32', S_IFMT: 'i32', S_IFDIR: 'i32', + S_IFREG: 'i32', O_RDWR: 'i32', EAGAIN: 'i32', + // WIN Specific + _S_IREAD: 'i32', + _S_IWRITE: 'i32', + _O_APPEND: 'i32', + _O_BINARY: 'i32', + _O_CREAT: 'i32', + _O_RDONLY: 'i32', + _O_RDWR: 'i32', + _O_TEXT: 'i32', + _O_TRUNC: 'i32', + _O_WRONLY: 'i32', + _O_U16TEXT: 'i32', + _O_U8TEXT: 'i32', +} + +const structs = ['fastcall'] + +export { + api, includes, name, libs, obj, constants, structs, preamble +} diff --git a/lib/core2/core.cc b/lib/core2/core.cc new file mode 100644 index 0000000..b1fb147 --- /dev/null +++ b/lib/core2/core.cc @@ -0,0 +1,1193 @@ + +// [do not edit,] +// This file has been automatically generated, please do not change unless you disable auto-generation in the Makefile +#include + +#include + +#include + + + + + + +#include + +namespace lo { +namespace core { + +using v8::FunctionCallbackInfo; +using v8::Local; +using v8::ObjectTemplate; +using v8::Isolate; +using v8::Value; +using v8::Integer; +using v8::Number; +using v8::FunctionTemplate; +using v8::FunctionCallback; +using v8::CFunction; +using v8::CTypeInfo; +using v8::Uint8Array; +using v8::CFunctionInfo; +using v8::String; +using v8::Uint32Array; +using v8::ArrayBuffer; +using v8::Context; +using v8::Function; +using v8::Object; +using v8::HandleScope; +using v8::BigInt; + + +#ifdef _WIN32 +#define strdup _strdup +#endif + + +struct fastcall { + void* wrapper; // 0-7 : v8 fastcall wrapper function pointer + uint8_t result; // 8 : the type of the result + uint8_t nparam; // 9 : the number of args (max 255) + uint8_t param[30]; // 10-39 : an array of types of the arguments + uint64_t args[32]; // 40-295: an array of pointer slots for arguments + // these will be filled in dynamically by + // lo::core::SlowCallback for the slow call + // and then the slowcall wrapper will shift them from + // this structure into regs + stack and make the call + // the first slot is reserved for the result + void* fn; // 296-303: the slowcall wrapper function pointer +}; + +typedef void (*lo_fast_call)(void*); + +inline uint8_t needsunwrap (lo::FastTypes t) { + if (t == lo::FastTypes::buffer) return 1; + if (t == lo::FastTypes::u32array) return 1; + if (t == lo::FastTypes::pointer) return 1; + if (t == lo::FastTypes::u64) return 1; + if (t == lo::FastTypes::i64) return 1; + return 0; +} + +v8::CTypeInfo* CTypeFromV8 (uint8_t v8Type) { + if (v8Type == lo::FastTypes::boolean) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kBool); + if (v8Type == lo::FastTypes::i8) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt32); + if (v8Type == lo::FastTypes::i16) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt32); + if (v8Type == lo::FastTypes::i32) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt32); + if (v8Type == lo::FastTypes::u8) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint32); + if (v8Type == lo::FastTypes::u16) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint32); + if (v8Type == lo::FastTypes::u32) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint32); + if (v8Type == lo::FastTypes::f32) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kFloat32); + if (v8Type == lo::FastTypes::f64) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kFloat64); + if (v8Type == lo::FastTypes::i64) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt64); + if (v8Type == lo::FastTypes::u64) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + if (v8Type == lo::FastTypes::iSize) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt64); + if (v8Type == lo::FastTypes::uSize) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + if (v8Type == lo::FastTypes::pointer) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + if (v8Type == lo::FastTypes::function) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + if (v8Type == lo::FastTypes::string) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kSeqOneByteString); + if (v8Type == lo::FastTypes::buffer) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + if (v8Type == lo::FastTypes::u32array) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + return new v8::CTypeInfo(v8::CTypeInfo::Type::kVoid); +} + +void lo_fastcall (struct fastcall* state) { + ((lo_fast_call)state->fn)(&state->args); +} + +void SlowCallback(const FunctionCallbackInfo &args) { + Isolate* isolate = args.GetIsolate(); + HandleScope scope(isolate); + struct fastcall* state = (struct fastcall*)args.Data() + .As()->GetAlignedPointerFromInternalField(1); + int r = 1; + int s = 0; + char* temp_strs[100]; + for (int i = 0; i < state->nparam; i++) { + switch (state->param[i]) { + case FastTypes::string: + { + String::Utf8Value arg0(isolate, args[i]); + temp_strs[s] = strdup(*arg0); + state->args[r++] = (uint64_t)temp_strs[s++]; + } + break; + case FastTypes::u32: + state->args[r++] = (uint32_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::u16: + state->args[r++] = (uint16_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::u8: + state->args[r++] = (uint8_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::boolean: + state->args[r++] = (bool)Local::Cast(args[i])->Value(); + break; + case FastTypes::i32: + state->args[r++] = (int32_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::i16: + state->args[r++] = (int16_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::i8: + state->args[r++] = (int8_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::i64: + case FastTypes::iSize: + state->args[r++] = (int64_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::u64: + case FastTypes::pointer: + case FastTypes::uSize: + state->args[r++] = (uint64_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::buffer: + { + Local u8 = args[i].As(); + state->args[r++] = (uint64_t)((uint8_t*)u8->Buffer()->Data() + + u8->ByteOffset()); + } + break; + case FastTypes::u32array: + { + Local u32 = args[i].As(); + state->args[r++] = (uint64_t)((uint8_t*)u32->Buffer()->Data() + + u32->ByteOffset()); + } + break; + case FastTypes::function: + break; + case FastTypes::f32: + { + float src = (float)args[i].As()->Value(); + float* dst = (float*)&state->args[r++]; + *dst = src; + } + break; + case FastTypes::f64: + { + double src = (double)args[i].As()->Value(); + double* dst = (double*)&state->args[r++]; + *dst = src; + } + break; + } + } + lo_fastcall(state); + for (int i = 0; i < s; i++) { + free(temp_strs[i]); + } + switch (state->result) { + case FastTypes::i32: + args.GetReturnValue().Set((int32_t)state->args[0]); + break; + case FastTypes::u32: + args.GetReturnValue().Set((uint32_t)state->args[0]); + break; + case FastTypes::boolean: + args.GetReturnValue().Set((bool)state->args[0]); + break; + case FastTypes::f32: + { + float* dst = (float*)&state->args[0]; + args.GetReturnValue().Set(Number::New(isolate, *dst)); + } + break; + case FastTypes::f64: + { + double* dst = (double*)&state->args[0]; + args.GetReturnValue().Set(Number::New(isolate, *dst)); + } + break; + case FastTypes::i64: + { + int64_t* res = reinterpret_cast((uint64_t)Local::Cast(args[args.Length() - 1])->Value()); + *res = state->args[0]; + } + break; + case FastTypes::buffer: + case FastTypes::u32array: + case FastTypes::u64: + case FastTypes::pointer: + { + uint64_t* res = reinterpret_cast((uint64_t)Local::Cast(args[args.Length() - 1])->Value()); + *res = state->args[0]; + } + break; + } +} + +void bind_fastcallSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + Local context = isolate->GetCurrentContext(); + // TODO - does integer work? + struct fastcall* state = reinterpret_cast( + Local::Cast(args[0])->Value()); + Local tpl = ObjectTemplate::New(isolate); + tpl->SetInternalFieldCount(2); + Local data = tpl->NewInstance(context).ToLocalChecked(); + data->SetAlignedPointerInInternalField(1, state); + uint8_t unwrap = needsunwrap((FastTypes)state->result); + int fastlen = state->nparam + 1 + unwrap; + CTypeInfo* cargs = (CTypeInfo*)calloc(fastlen, sizeof(CTypeInfo)); + cargs[0] = CTypeInfo(CTypeInfo::Type::kV8Value); + for (int i = 0; i < state->nparam; i++) { + uint8_t ptype = state->param[i]; + cargs[i + 1] = *CTypeFromV8(ptype); + } + CTypeInfo* rc; + if (unwrap) { + cargs[fastlen - 1] = *CTypeFromV8(FastTypes::u32array); + rc = CTypeFromV8(FastTypes::empty); + } else { + rc = CTypeFromV8((FastTypes)state->result); + } + CFunctionInfo* info = new CFunctionInfo(*rc, fastlen, cargs); + CFunction* fastCFunc = new CFunction(state->wrapper, info); + Local funcTemplate = FunctionTemplate::New(isolate, + SlowCallback, data, Local(), 0, v8::ConstructorBehavior::kThrow, + v8::SideEffectType::kHasNoSideEffect, fastCFunc + ); + Local fun = + funcTemplate->GetFunction(context).ToLocalChecked(); + args.GetReturnValue().Set(fun); +} + +void bind_slowcallSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + Local context = isolate->GetCurrentContext(); + struct fastcall* state = reinterpret_cast( + Local::Cast(args[0])->Value()); + Local tpl = ObjectTemplate::New(isolate); + tpl->SetInternalFieldCount(2); + Local data = tpl->NewInstance(context).ToLocalChecked(); + data->SetAlignedPointerInInternalField(1, state); + Local funcTemplate = FunctionTemplate::New(isolate, + SlowCallback, data, Local(), 0, v8::ConstructorBehavior::kThrow, + v8::SideEffectType::kHasNoSideEffect, 0 + ); + Local fun = + funcTemplate->GetFunction(context).ToLocalChecked(); + args.GetReturnValue().Set(fun); +} + +#ifdef __linux__ + +#endif +#ifdef __MACH__ + +#endif + +void callocFast(void* p, uint32_t p0, uint32_t p1, uint64_t* p_ret); +CTypeInfo cargscalloc[4] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kUint64) +}; +CTypeInfo rccalloc = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infocalloc = CFunctionInfo(rccalloc, 4, cargscalloc); +CFunction pFcalloc = CFunction((const void*)&callocFast, &infocalloc); + +int32_t readFast(void* p, int32_t p0, uint64_t* p1, int32_t p2); +CTypeInfo cargsread[4] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcread = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo inforead = CFunctionInfo(rcread, 4, cargsread); +CFunction pFread = CFunction((const void*)&readFast, &inforead); + +int32_t writeFast(void* p, int32_t p0, uint64_t* p1, int32_t p2); +CTypeInfo cargswrite[4] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcwrite = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infowrite = CFunctionInfo(rcwrite, 4, cargswrite); +CFunction pFwrite = CFunction((const void*)&writeFast, &infowrite); + +int32_t write_stringFast(void* p, int32_t p0, struct FastOneByteString* const p1); +CTypeInfo cargswrite_string[3] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), + CTypeInfo(CTypeInfo::Type::kSeqOneByteString), +}; +CTypeInfo rcwrite_string = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infowrite_string = CFunctionInfo(rcwrite_string, 3, cargswrite_string); +CFunction pFwrite_string = CFunction((const void*)&write_stringFast, &infowrite_string); + +int32_t putcharFast(void* p, int32_t p0); +CTypeInfo cargsputchar[2] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcputchar = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infoputchar = CFunctionInfo(rcputchar, 2, cargsputchar); +CFunction pFputchar = CFunction((const void*)&putcharFast, &infoputchar); + +int32_t getcharFast(void* p); +CTypeInfo cargsgetchar[1] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + +}; +CTypeInfo rcgetchar = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infogetchar = CFunctionInfo(rcgetchar, 1, cargsgetchar); +CFunction pFgetchar = CFunction((const void*)&getcharFast, &infogetchar); + +int32_t closeFast(void* p, int32_t p0); +CTypeInfo cargsclose[2] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcclose = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infoclose = CFunctionInfo(rcclose, 2, cargsclose); +CFunction pFclose = CFunction((const void*)&closeFast, &infoclose); + +uint32_t lseekFast(void* p, int32_t p0, uint32_t p1, int32_t p2); +CTypeInfo cargslseek[4] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rclseek = CTypeInfo(CTypeInfo::Type::kUint32); +CFunctionInfo infolseek = CFunctionInfo(rclseek, 4, cargslseek); +CFunction pFlseek = CFunction((const void*)&lseekFast, &infolseek); + +int32_t fstatFast(void* p, int32_t p0, uint64_t* p1); +CTypeInfo cargsfstat[3] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), + CTypeInfo(CTypeInfo::Type::kUint64), +}; +CTypeInfo rcfstat = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infofstat = CFunctionInfo(rcfstat, 3, cargsfstat); +CFunction pFfstat = CFunction((const void*)&fstatFast, &infofstat); + +int32_t renameFast(void* p, struct FastOneByteString* const p0, struct FastOneByteString* const p1); +CTypeInfo cargsrename[3] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kSeqOneByteString), + CTypeInfo(CTypeInfo::Type::kSeqOneByteString), +}; +CTypeInfo rcrename = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo inforename = CFunctionInfo(rcrename, 3, cargsrename); +CFunction pFrename = CFunction((const void*)&renameFast, &inforename); + +int32_t openFast(void* p, struct FastOneByteString* const p0, int32_t p1, int32_t p2); +CTypeInfo cargsopen[4] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kSeqOneByteString), + CTypeInfo(CTypeInfo::Type::kInt32), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcopen = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infoopen = CFunctionInfo(rcopen, 4, cargsopen); +CFunction pFopen = CFunction((const void*)&openFast, &infoopen); + +int32_t unlinkFast(void* p, struct FastOneByteString* const p0); +CTypeInfo cargsunlink[2] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kSeqOneByteString), +}; +CTypeInfo rcunlink = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infounlink = CFunctionInfo(rcunlink, 2, cargsunlink); +CFunction pFunlink = CFunction((const void*)&unlinkFast, &infounlink); + +void memcpyFast(void* p, uint64_t* p0, uint64_t* p1, uint32_t p2, uint64_t* p_ret); +CTypeInfo cargsmemcpy[5] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kUint64) +}; +CTypeInfo rcmemcpy = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infomemcpy = CFunctionInfo(rcmemcpy, 5, cargsmemcpy); +CFunction pFmemcpy = CFunction((const void*)&memcpyFast, &infomemcpy); + +void memsetFast(void* p, uint64_t* p0, int32_t p1, uint32_t p2, uint64_t* p_ret); +CTypeInfo cargsmemset[5] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kInt32), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kUint64) +}; +CTypeInfo rcmemset = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infomemset = CFunctionInfo(rcmemset, 5, cargsmemset); +CFunction pFmemset = CFunction((const void*)&memsetFast, &infomemset); + +void memmoveFast(void* p, uint64_t* p0, uint64_t* p1, uint32_t p2, uint64_t* p_ret); +CTypeInfo cargsmemmove[5] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kUint64) +}; +CTypeInfo rcmemmove = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infomemmove = CFunctionInfo(rcmemmove, 5, cargsmemmove); +CFunction pFmemmove = CFunction((const void*)&memmoveFast, &infomemmove); + +void mallocFast(void* p, uint32_t p0, uint64_t* p_ret); +CTypeInfo cargsmalloc[3] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kUint64) +}; +CTypeInfo rcmalloc = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infomalloc = CFunctionInfo(rcmalloc, 3, cargsmalloc); +CFunction pFmalloc = CFunction((const void*)&mallocFast, &infomalloc); + +void reallocFast(void* p, uint64_t* p0, uint32_t p1, uint64_t* p_ret); +CTypeInfo cargsrealloc[4] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kUint64) +}; +CTypeInfo rcrealloc = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo inforealloc = CFunctionInfo(rcrealloc, 4, cargsrealloc); +CFunction pFrealloc = CFunction((const void*)&reallocFast, &inforealloc); + +void aligned_allocFast(void* p, uint32_t p0, uint32_t p1, uint64_t* p_ret); +CTypeInfo cargsaligned_alloc[4] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kUint64) +}; +CTypeInfo rcaligned_alloc = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infoaligned_alloc = CFunctionInfo(rcaligned_alloc, 4, cargsaligned_alloc); +CFunction pFaligned_alloc = CFunction((const void*)&aligned_allocFast, &infoaligned_alloc); + +void freeFast(void* p, uint64_t* p0); +CTypeInfo cargsfree[2] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint64), +}; +CTypeInfo rcfree = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infofree = CFunctionInfo(rcfree, 2, cargsfree); +CFunction pFfree = CFunction((const void*)&freeFast, &infofree); + +void fastcallFast(void* p, uint64_t* p0); +CTypeInfo cargsfastcall[2] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint64), +}; +CTypeInfo rcfastcall = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infofastcall = CFunctionInfo(rcfastcall, 2, cargsfastcall); +CFunction pFfastcall = CFunction((const void*)&fastcallFast, &infofastcall); + +void getenvFast(void* p, struct FastOneByteString* const p0, uint64_t* p_ret); +CTypeInfo cargsgetenv[3] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kSeqOneByteString), + CTypeInfo(CTypeInfo::Type::kUint64) +}; +CTypeInfo rcgetenv = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infogetenv = CFunctionInfo(rcgetenv, 3, cargsgetenv); +CFunction pFgetenv = CFunction((const void*)&getenvFast, &infogetenv); + +int32_t dupFast(void* p, int32_t p0); +CTypeInfo cargsdup[2] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcdup = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infodup = CFunctionInfo(rcdup, 2, cargsdup); +CFunction pFdup = CFunction((const void*)&dupFast, &infodup); + +int32_t dup2Fast(void* p, int32_t p0, int32_t p1); +CTypeInfo cargsdup2[3] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcdup2 = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infodup2 = CFunctionInfo(rcdup2, 3, cargsdup2); +CFunction pFdup2 = CFunction((const void*)&dup2Fast, &infodup2); + +void getcwdFast(void* p, uint64_t* p0, int32_t p1, uint64_t* p_ret); +CTypeInfo cargsgetcwd[4] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kInt32), + CTypeInfo(CTypeInfo::Type::kUint64) +}; +CTypeInfo rcgetcwd = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infogetcwd = CFunctionInfo(rcgetcwd, 4, cargsgetcwd); +CFunction pFgetcwd = CFunction((const void*)&getcwdFast, &infogetcwd); + +int32_t getpidFast(void* p); +CTypeInfo cargsgetpid[1] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + +}; +CTypeInfo rcgetpid = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infogetpid = CFunctionInfo(rcgetpid, 1, cargsgetpid); +CFunction pFgetpid = CFunction((const void*)&getpidFast, &infogetpid); + +int32_t execveFast(void* p, struct FastOneByteString* const p0, uint64_t* p1, uint64_t* p2); +CTypeInfo cargsexecve[4] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kSeqOneByteString), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kUint64), +}; +CTypeInfo rcexecve = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infoexecve = CFunctionInfo(rcexecve, 4, cargsexecve); +CFunction pFexecve = CFunction((const void*)&execveFast, &infoexecve); + +int32_t execvpFast(void* p, struct FastOneByteString* const p0, uint64_t* p1); +CTypeInfo cargsexecvp[3] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kSeqOneByteString), + CTypeInfo(CTypeInfo::Type::kUint64), +}; +CTypeInfo rcexecvp = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infoexecvp = CFunctionInfo(rcexecvp, 3, cargsexecvp); +CFunction pFexecvp = CFunction((const void*)&execvpFast, &infoexecvp); + +void exitFast(void* p, int32_t p0); +CTypeInfo cargsexit[2] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcexit = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infoexit = CFunctionInfo(rcexit, 2, cargsexit); +CFunction pFexit = CFunction((const void*)&exitFast, &infoexit); + +void isolate_context_destroyFast(void* p, uint64_t* p0); +CTypeInfo cargsisolate_context_destroy[2] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint64), +}; +CTypeInfo rcisolate_context_destroy = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infoisolate_context_destroy = CFunctionInfo(rcisolate_context_destroy, 2, cargsisolate_context_destroy); +CFunction pFisolate_context_destroy = CFunction((const void*)&isolate_context_destroyFast, &infoisolate_context_destroy); + +int32_t isolate_context_sizeFast(void* p); +CTypeInfo cargsisolate_context_size[1] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + +}; +CTypeInfo rcisolate_context_size = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infoisolate_context_size = CFunctionInfo(rcisolate_context_size, 1, cargsisolate_context_size); +CFunction pFisolate_context_size = CFunction((const void*)&isolate_context_sizeFast, &infoisolate_context_size); + +uint32_t strnlenFast(void* p, uint64_t* p0, uint32_t p1); +CTypeInfo cargsstrnlen[3] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kUint32), +}; +CTypeInfo rcstrnlen = CTypeInfo(CTypeInfo::Type::kUint32); +CFunctionInfo infostrnlen = CFunctionInfo(rcstrnlen, 3, cargsstrnlen); +CFunction pFstrnlen = CFunction((const void*)&strnlenFast, &infostrnlen); + +int32_t isattyFast(void* p, int32_t p0); +CTypeInfo cargsisatty[2] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcisatty = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infoisatty = CFunctionInfo(rcisatty, 2, cargsisatty); +CFunction pFisatty = CFunction((const void*)&isattyFast, &infoisatty); + +#ifdef __linux__ + +#endif +#ifdef __MACH__ + +#endif + +void callocSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + uint32_t v0 = Local::Cast(args[0])->Value(); + uint32_t v1 = Local::Cast(args[1])->Value(); + void* rc = calloc(v0, v1); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); +} + +void callocFast(void* p, uint32_t p0, uint32_t p1, uint64_t* p_ret) { + uint32_t v0 = p0; + uint32_t v1 = p1; + void* r = calloc(v0, v1); + + p_ret[0] = (uint64_t)r; +} +void readSlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + void* v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + int32_t v2 = Local::Cast(args[2])->Value(); + int32_t rc = _read(v0, v1, v2); + args.GetReturnValue().Set(rc); +} + +int32_t readFast(void* p, int32_t p0, uint64_t* p1, int32_t p2) { + int32_t v0 = p0; + void* v1 = reinterpret_cast(p1); + int32_t v2 = p2; + return _read(v0, v1, v2); +} +void writeSlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + void* v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + int32_t v2 = Local::Cast(args[2])->Value(); + int32_t rc = _write(v0, v1, v2); + args.GetReturnValue().Set(rc); +} + +int32_t writeFast(void* p, int32_t p0, uint64_t* p1, int32_t p2) { + int32_t v0 = p0; + void* v1 = reinterpret_cast(p1); + int32_t v2 = p2; + return _write(v0, v1, v2); +} +void write_stringSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + int32_t v0 = Local::Cast(args[0])->Value(); + String::Utf8Value v1(isolate, args[1]); + int32_t v2 = v1.length(); + int32_t rc = _write(v0, *v1, v2); + args.GetReturnValue().Set(rc); +} + +int32_t write_stringFast(void* p, int32_t p0, struct FastOneByteString* const p1) { + int32_t v0 = p0; + struct FastOneByteString* const v1 = p1; + int32_t v2 = p1->length; + return _write(v0, v1->data, v2); +} +void putcharSlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + int32_t rc = putchar(v0); + args.GetReturnValue().Set(rc); +} + +int32_t putcharFast(void* p, int32_t p0) { + int32_t v0 = p0; + return putchar(v0); +} +void getcharSlow(const FunctionCallbackInfo &args) { + + int32_t rc = getchar(); + args.GetReturnValue().Set(rc); +} + +int32_t getcharFast(void* p) { + + return getchar(); +} +void closeSlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + int32_t rc = _close(v0); + args.GetReturnValue().Set(rc); +} + +int32_t closeFast(void* p, int32_t p0) { + int32_t v0 = p0; + return _close(v0); +} +void lseekSlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + uint32_t v1 = Local::Cast(args[1])->Value(); + int32_t v2 = Local::Cast(args[2])->Value(); + uint32_t rc = _lseek(v0, v1, v2); + args.GetReturnValue().Set(rc); +} + +uint32_t lseekFast(void* p, int32_t p0, uint32_t p1, int32_t p2) { + int32_t v0 = p0; + uint32_t v1 = p1; + int32_t v2 = p2; + return _lseek(v0, v1, v2); +} +void fstatSlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + struct _stat * v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + int32_t rc = _fstat(v0, v1); + args.GetReturnValue().Set(rc); +} + +int32_t fstatFast(void* p, int32_t p0, uint64_t* p1) { + int32_t v0 = p0; + struct _stat * v1 = reinterpret_cast(p1); + return _fstat(v0, v1); +} +void renameSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + String::Utf8Value v0(isolate, args[0]); + String::Utf8Value v1(isolate, args[1]); + int32_t rc = rename(*v0, *v1); + args.GetReturnValue().Set(rc); +} + +int32_t renameFast(void* p, struct FastOneByteString* const p0, struct FastOneByteString* const p1) { + struct FastOneByteString* const v0 = p0; + struct FastOneByteString* const v1 = p1; + return rename(v0->data, v1->data); +} +void openSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + String::Utf8Value v0(isolate, args[0]); + int32_t v1 = Local::Cast(args[1])->Value(); + int32_t v2 = Local::Cast(args[2])->Value(); + int32_t rc = _open(*v0, v1, v2); + args.GetReturnValue().Set(rc); +} + +int32_t openFast(void* p, struct FastOneByteString* const p0, int32_t p1, int32_t p2) { + struct FastOneByteString* const v0 = p0; + int32_t v1 = p1; + int32_t v2 = p2; + return _open(v0->data, v1, v2); +} +void unlinkSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + String::Utf8Value v0(isolate, args[0]); + int32_t rc = _unlink(*v0); + args.GetReturnValue().Set(rc); +} + +int32_t unlinkFast(void* p, struct FastOneByteString* const p0) { + struct FastOneByteString* const v0 = p0; + return _unlink(v0->data); +} +void memcpySlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + void* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + void* v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + uint32_t v2 = Local::Cast(args[2])->Value(); + void* rc = memcpy(v0, v1, v2); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); +} + +void memcpyFast(void* p, uint64_t* p0, uint64_t* p1, uint32_t p2, uint64_t* p_ret) { + void* v0 = reinterpret_cast(p0); + void* v1 = reinterpret_cast(p1); + uint32_t v2 = p2; + void* r = memcpy(v0, v1, v2); + + p_ret[0] = (uint64_t)r; +} +void memsetSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + void* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + int32_t v1 = Local::Cast(args[1])->Value(); + uint32_t v2 = Local::Cast(args[2])->Value(); + void* rc = memset(v0, v1, v2); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); +} + +void memsetFast(void* p, uint64_t* p0, int32_t p1, uint32_t p2, uint64_t* p_ret) { + void* v0 = reinterpret_cast(p0); + int32_t v1 = p1; + uint32_t v2 = p2; + void* r = memset(v0, v1, v2); + + p_ret[0] = (uint64_t)r; +} +void memmoveSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + void* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + void* v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + uint32_t v2 = Local::Cast(args[2])->Value(); + void* rc = memmove(v0, v1, v2); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); +} + +void memmoveFast(void* p, uint64_t* p0, uint64_t* p1, uint32_t p2, uint64_t* p_ret) { + void* v0 = reinterpret_cast(p0); + void* v1 = reinterpret_cast(p1); + uint32_t v2 = p2; + void* r = memmove(v0, v1, v2); + + p_ret[0] = (uint64_t)r; +} +void mallocSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + uint32_t v0 = Local::Cast(args[0])->Value(); + void* rc = malloc(v0); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); +} + +void mallocFast(void* p, uint32_t p0, uint64_t* p_ret) { + uint32_t v0 = p0; + void* r = malloc(v0); + + p_ret[0] = (uint64_t)r; +} +void reallocSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + void* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + uint32_t v1 = Local::Cast(args[1])->Value(); + void* rc = realloc(v0, v1); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); +} + +void reallocFast(void* p, uint64_t* p0, uint32_t p1, uint64_t* p_ret) { + void* v0 = reinterpret_cast(p0); + uint32_t v1 = p1; + void* r = realloc(v0, v1); + + p_ret[0] = (uint64_t)r; +} +void aligned_allocSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + uint32_t v0 = Local::Cast(args[0])->Value(); + uint32_t v1 = Local::Cast(args[1])->Value(); + void* rc = _aligned_malloc(v0, v1); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); +} + +void aligned_allocFast(void* p, uint32_t p0, uint32_t p1, uint64_t* p_ret) { + uint32_t v0 = p0; + uint32_t v1 = p1; + void* r = _aligned_malloc(v0, v1); + + p_ret[0] = (uint64_t)r; +} +void freeSlow(const FunctionCallbackInfo &args) { + void* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + free(v0); +} + +void freeFast(void* p, uint64_t* p0) { + void* v0 = reinterpret_cast(p0); + free(v0); +} +void fastcallSlow(const FunctionCallbackInfo &args) { + struct fastcall* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + lo_fastcall(v0); +} + +void fastcallFast(void* p, uint64_t* p0) { + struct fastcall* v0 = reinterpret_cast(p0); + lo_fastcall(v0); +} +void getenvSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + String::Utf8Value v0(isolate, args[0]); + char* rc = getenv(*v0); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); +} + +void getenvFast(void* p, struct FastOneByteString* const p0, uint64_t* p_ret) { + struct FastOneByteString* const v0 = p0; + char* r = getenv(v0->data); + + p_ret[0] = (uint64_t)r; +} +void dupSlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + int32_t rc = _dup(v0); + args.GetReturnValue().Set(rc); +} + +int32_t dupFast(void* p, int32_t p0) { + int32_t v0 = p0; + return _dup(v0); +} +void dup2Slow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + int32_t v1 = Local::Cast(args[1])->Value(); + int32_t rc = _dup2(v0, v1); + args.GetReturnValue().Set(rc); +} + +int32_t dup2Fast(void* p, int32_t p0, int32_t p1) { + int32_t v0 = p0; + int32_t v1 = p1; + return _dup2(v0, v1); +} +void getcwdSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + char* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + int32_t v1 = Local::Cast(args[1])->Value(); + void* rc = _getcwd(v0, v1); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); +} + +void getcwdFast(void* p, uint64_t* p0, int32_t p1, uint64_t* p_ret) { + char* v0 = reinterpret_cast(p0); + int32_t v1 = p1; + void* r = _getcwd(v0, v1); + + p_ret[0] = (uint64_t)r; +} +void getpidSlow(const FunctionCallbackInfo &args) { + + int32_t rc = _getpid(); + args.GetReturnValue().Set(rc); +} + +int32_t getpidFast(void* p) { + + return _getpid(); +} +void execveSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + String::Utf8Value v0(isolate, args[0]); + char* const* v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + char* const* v2 = reinterpret_cast((uint64_t)Local::Cast(args[2])->Value()); + int32_t rc = _execve(*v0, v1, v2); + args.GetReturnValue().Set(rc); +} + +int32_t execveFast(void* p, struct FastOneByteString* const p0, uint64_t* p1, uint64_t* p2) { + struct FastOneByteString* const v0 = p0; + char* const* v1 = reinterpret_cast(p1); + char* const* v2 = reinterpret_cast(p2); + return _execve(v0->data, v1, v2); +} +void execvpSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + String::Utf8Value v0(isolate, args[0]); + char* const* v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + int32_t rc = _execvp(*v0, v1); + args.GetReturnValue().Set(rc); +} + +int32_t execvpFast(void* p, struct FastOneByteString* const p0, uint64_t* p1) { + struct FastOneByteString* const v0 = p0; + char* const* v1 = reinterpret_cast(p1); + return _execvp(v0->data, v1); +} +void exitSlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + exit(v0); +} + +void exitFast(void* p, int32_t p0) { + int32_t v0 = p0; + exit(v0); +} +void isolate_createSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + int32_t v0 = Local::Cast(args[0])->Value(); + char** v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + String::Utf8Value v2(isolate, args[2]); + uint32_t v3 = Local::Cast(args[3])->Value(); + String::Utf8Value v4(isolate, args[4]); + uint32_t v5 = Local::Cast(args[5])->Value(); + char* v6 = reinterpret_cast((uint64_t)Local::Cast(args[6])->Value()); + int32_t v7 = Local::Cast(args[7])->Value(); + int32_t v8 = Local::Cast(args[8])->Value(); + uint64_t v9 = Local::Cast(args[9])->Value(); + String::Utf8Value v10(isolate, args[10]); + String::Utf8Value v11(isolate, args[11]); + int32_t v12 = Local::Cast(args[12])->Value(); + int32_t v13 = Local::Cast(args[13])->Value(); + void* v14 = reinterpret_cast((uint64_t)Local::Cast(args[14])->Value()); + int32_t rc = lo_create_isolate(v0, v1, *v2, v3, *v4, v5, v6, v7, v8, v9, *v10, *v11, v12, v13, v14); + args.GetReturnValue().Set(rc); +} + +void isolate_context_createSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + int32_t v0 = Local::Cast(args[0])->Value(); + char** v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + String::Utf8Value v2(isolate, args[2]); + uint32_t v3 = Local::Cast(args[3])->Value(); + String::Utf8Value v4(isolate, args[4]); + uint32_t v5 = Local::Cast(args[5])->Value(); + char* v6 = reinterpret_cast((uint64_t)Local::Cast(args[6])->Value()); + int32_t v7 = Local::Cast(args[7])->Value(); + int32_t v8 = Local::Cast(args[8])->Value(); + uint64_t v9 = Local::Cast(args[9])->Value(); + String::Utf8Value v10(isolate, args[10]); + String::Utf8Value v11(isolate, args[11]); + int32_t v12 = Local::Cast(args[12])->Value(); + int32_t v13 = Local::Cast(args[13])->Value(); + void* v14 = reinterpret_cast((uint64_t)Local::Cast(args[14])->Value()); + struct isolate_context* v15 = reinterpret_cast((uint64_t)Local::Cast(args[15])->Value()); + lo_create_isolate_context(v0, v1, *v2, v3, *v4, v5, v6, v7, v8, v9, *v10, *v11, v12, v13, v14, v15); +} + +void isolate_context_destroySlow(const FunctionCallbackInfo &args) { + struct isolate_context* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + lo_destroy_isolate_context(v0); +} + +void isolate_context_destroyFast(void* p, uint64_t* p0) { + struct isolate_context* v0 = reinterpret_cast(p0); + lo_destroy_isolate_context(v0); +} +void isolate_context_sizeSlow(const FunctionCallbackInfo &args) { + + int32_t rc = lo_context_size(); + args.GetReturnValue().Set(rc); +} + +int32_t isolate_context_sizeFast(void* p) { + + return lo_context_size(); +} +void isolate_startSlow(const FunctionCallbackInfo &args) { + void* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + lo_start_isolate(v0); +} + +void callbackSlow(const FunctionCallbackInfo &args) { + exec_info* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + lo_callback(v0); +} + +void strnlenSlow(const FunctionCallbackInfo &args) { + const char* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + uint32_t v1 = Local::Cast(args[1])->Value(); + uint32_t rc = strnlen(v0, v1); + args.GetReturnValue().Set(rc); +} + +uint32_t strnlenFast(void* p, uint64_t* p0, uint32_t p1) { + const char* v0 = reinterpret_cast(p0); + uint32_t v1 = p1; + return strnlen(v0, v1); +} +void isattySlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + int32_t rc = _isatty(v0); + args.GetReturnValue().Set(rc); +} + +int32_t isattyFast(void* p, int32_t p0) { + int32_t v0 = p0; + return _isatty(v0); +} +#ifdef __linux__ + +#endif +#ifdef __MACH__ + +#endif +void Init(Isolate* isolate, Local target) { + Local module = ObjectTemplate::New(isolate); + SET_FAST_METHOD(isolate, module, "calloc", &pFcalloc, callocSlow); + SET_FAST_METHOD(isolate, module, "read", &pFread, readSlow); + SET_FAST_METHOD(isolate, module, "write", &pFwrite, writeSlow); + SET_FAST_METHOD(isolate, module, "write_string", &pFwrite_string, write_stringSlow); + SET_FAST_METHOD(isolate, module, "putchar", &pFputchar, putcharSlow); + SET_FAST_METHOD(isolate, module, "getchar", &pFgetchar, getcharSlow); + SET_FAST_METHOD(isolate, module, "close", &pFclose, closeSlow); + SET_FAST_METHOD(isolate, module, "lseek", &pFlseek, lseekSlow); + SET_FAST_METHOD(isolate, module, "fstat", &pFfstat, fstatSlow); + SET_FAST_METHOD(isolate, module, "rename", &pFrename, renameSlow); + SET_FAST_METHOD(isolate, module, "open", &pFopen, openSlow); + SET_FAST_METHOD(isolate, module, "unlink", &pFunlink, unlinkSlow); + SET_FAST_METHOD(isolate, module, "memcpy", &pFmemcpy, memcpySlow); + SET_FAST_METHOD(isolate, module, "memset", &pFmemset, memsetSlow); + SET_FAST_METHOD(isolate, module, "memmove", &pFmemmove, memmoveSlow); + SET_FAST_METHOD(isolate, module, "malloc", &pFmalloc, mallocSlow); + SET_FAST_METHOD(isolate, module, "realloc", &pFrealloc, reallocSlow); + SET_FAST_METHOD(isolate, module, "aligned_alloc", &pFaligned_alloc, aligned_allocSlow); + SET_FAST_METHOD(isolate, module, "free", &pFfree, freeSlow); + SET_METHOD(isolate, module, "bind_fastcall", bind_fastcallSlow); + SET_METHOD(isolate, module, "bind_slowcall", bind_slowcallSlow); + SET_FAST_METHOD(isolate, module, "fastcall", &pFfastcall, fastcallSlow); + SET_FAST_METHOD(isolate, module, "getenv", &pFgetenv, getenvSlow); + SET_FAST_METHOD(isolate, module, "dup", &pFdup, dupSlow); + SET_FAST_METHOD(isolate, module, "dup2", &pFdup2, dup2Slow); + SET_FAST_METHOD(isolate, module, "getcwd", &pFgetcwd, getcwdSlow); + SET_FAST_METHOD(isolate, module, "getpid", &pFgetpid, getpidSlow); + SET_FAST_METHOD(isolate, module, "execve", &pFexecve, execveSlow); + SET_FAST_METHOD(isolate, module, "execvp", &pFexecvp, execvpSlow); + SET_FAST_METHOD(isolate, module, "exit", &pFexit, exitSlow); + SET_METHOD(isolate, module, "isolate_create", isolate_createSlow); + SET_METHOD(isolate, module, "isolate_context_create", isolate_context_createSlow); + SET_FAST_METHOD(isolate, module, "isolate_context_destroy", &pFisolate_context_destroy, isolate_context_destroySlow); + SET_FAST_METHOD(isolate, module, "isolate_context_size", &pFisolate_context_size, isolate_context_sizeSlow); + SET_METHOD(isolate, module, "isolate_start", isolate_startSlow); + SET_METHOD(isolate, module, "callback", callbackSlow); + SET_FAST_METHOD(isolate, module, "strnlen", &pFstrnlen, strnlenSlow); + SET_FAST_METHOD(isolate, module, "isatty", &pFisatty, isattySlow); + +#ifdef __linux__ + +#endif +#ifdef __MACH__ + +#endif + SET_VALUE(isolate, module, "S_IFCHR", Integer::New(isolate, (int32_t)S_IFCHR)); + SET_VALUE(isolate, module, "O_RDONLY", Integer::New(isolate, (int32_t)O_RDONLY)); + SET_VALUE(isolate, module, "O_WRONLY", Integer::New(isolate, (int32_t)O_WRONLY)); + SET_VALUE(isolate, module, "O_CREAT", Integer::New(isolate, (int32_t)O_CREAT)); + SET_VALUE(isolate, module, "O_TRUNC", Integer::New(isolate, (int32_t)O_TRUNC)); + SET_VALUE(isolate, module, "STDIN", Number::New(isolate, (int64_t)0)); + SET_VALUE(isolate, module, "STDOUT", Number::New(isolate, (int64_t)1)); + SET_VALUE(isolate, module, "STDERR", Number::New(isolate, (int64_t)2)); + SET_VALUE(isolate, module, "SEEK_SET", Integer::New(isolate, (int32_t)SEEK_SET)); + SET_VALUE(isolate, module, "SEEK_CUR", Integer::New(isolate, (int32_t)SEEK_CUR)); + SET_VALUE(isolate, module, "SEEK_END", Integer::New(isolate, (int32_t)SEEK_END)); + SET_VALUE(isolate, module, "S_IFMT", Integer::New(isolate, (int32_t)S_IFMT)); + SET_VALUE(isolate, module, "S_IFDIR", Integer::New(isolate, (int32_t)S_IFDIR)); + SET_VALUE(isolate, module, "S_IFREG", Integer::New(isolate, (int32_t)S_IFREG)); + SET_VALUE(isolate, module, "O_RDWR", Integer::New(isolate, (int32_t)O_RDWR)); + SET_VALUE(isolate, module, "EAGAIN", Integer::New(isolate, (int32_t)EAGAIN)); + SET_VALUE(isolate, module, "_S_IREAD", Integer::New(isolate, (int32_t)_S_IREAD)); + SET_VALUE(isolate, module, "_S_IWRITE", Integer::New(isolate, (int32_t)_S_IWRITE)); + SET_VALUE(isolate, module, "_O_APPEND", Integer::New(isolate, (int32_t)_O_APPEND)); + SET_VALUE(isolate, module, "_O_BINARY", Integer::New(isolate, (int32_t)_O_BINARY)); + SET_VALUE(isolate, module, "_O_CREAT", Integer::New(isolate, (int32_t)_O_CREAT)); + SET_VALUE(isolate, module, "_O_RDONLY", Integer::New(isolate, (int32_t)_O_RDONLY)); + SET_VALUE(isolate, module, "_O_RDWR", Integer::New(isolate, (int32_t)_O_RDWR)); + SET_VALUE(isolate, module, "_O_TEXT", Integer::New(isolate, (int32_t)_O_TEXT)); + SET_VALUE(isolate, module, "_O_TRUNC", Integer::New(isolate, (int32_t)_O_TRUNC)); + SET_VALUE(isolate, module, "_O_WRONLY", Integer::New(isolate, (int32_t)_O_WRONLY)); + SET_VALUE(isolate, module, "_O_U16TEXT", Integer::New(isolate, (int32_t)_O_U16TEXT)); + SET_VALUE(isolate, module, "_O_U8TEXT", Integer::New(isolate, (int32_t)_O_U8TEXT)); + +#ifdef __linux__ + +#endif +#ifdef __MACH__ + +#endif + +#ifdef __MACH__ + SET_VALUE(isolate, module, "struct_fastcall_size", Integer::New(isolate, sizeof(fastcall))); + +#endif +#ifdef __linux__ + SET_VALUE(isolate, module, "struct_fastcall_size", Integer::New(isolate, sizeof(fastcall))); + +#endif + SET_MODULE(isolate, target, "core", module); +} +} // namespace core +} // namespace lo + +extern "C" { + DLL_PUBLIC void* _register_core() { + return (void*)lo::core::Init; + } +} + diff --git a/lib/cpio.js b/lib/cpio.js new file mode 100644 index 0000000..86d2de4 --- /dev/null +++ b/lib/cpio.js @@ -0,0 +1,420 @@ +// COMPAT +let constants = {} +let stat +if (globalThis.lo) { + globalThis.readFileSync = lo.core.read_file + const { file_stat } = await import('lib/fs.js') + stat = file_stat + globalThis.args = lo.args.slice(2) + constants.S_IFBLK = lo.core.S_IFBLK + constants.S_IFCHR = lo.core.S_IFCHR + constants.S_IFIFO = lo.core.S_IFIFO + constants.S_IFMT = lo.core.S_IFMT + constants.S_IFDIR = lo.core.S_IFDIR + constants.S_IFREG = lo.core.S_IFREG + constants.S_IRUSR = lo.core.S_IRUSR + constants.S_IWUSR = lo.core.S_IWUSR + constants.S_IXUSR = lo.core.S_IXUSR + constants.S_IRGRP = lo.core.S_IRGRP + constants.S_IWGRP = lo.core.S_IWGRP + constants.S_IXGRP = lo.core.S_IXGRP + constants.S_IROTH = lo.core.S_IROTH + constants.S_IWOTH = lo.core.S_IWOTH + constants.S_IXOTH = lo.core.S_IXOTH + constants.S_IRWXU = lo.core.S_IRWXU + constants.S_IRWXG = lo.core.S_IRWXG + constants.S_IRWXO = lo.core.S_IRWXO + constants.O_WRONLY = lo.core.O_WRONLY + constants.O_RDONLY = lo.core.O_RDONLY + constants.O_RDWR = lo.core.O_RDWR + constants.O_CREAT = lo.core.O_CREAT + constants.O_TRUNC = lo.core.O_TRUNC +} else { + const fs = await import('node:fs') + stat = fs.statSync + globalThis.readFileSync = fs.readFileSync + globalThis.args = process.argv.slice(2) + constants.S_IFBLK = fs.constants.S_IFBLK + constants.S_IFCHR = fs.constants.S_IFCHR + constants.S_IFIFO = fs.constants.S_IFIFO + constants.S_IFMT = fs.constants.S_IFMT + constants.S_IFDIR = fs.constants.S_IFDIR + constants.S_IFREG = fs.constants.S_IFREG + constants.S_IRUSR = fs.constants.S_IRUSR + constants.S_IWUSR = fs.constants.S_IWUSR + constants.S_IXUSR = fs.constants.S_IXUSR + constants.S_IRGRP = fs.constants.S_IRGRP + constants.S_IWGRP = fs.constants.S_IWGRP + constants.S_IXGRP = fs.constants.S_IXGRP + constants.S_IROTH = fs.constants.S_IROTH + constants.S_IWOTH = fs.constants.S_IWOTH + constants.S_IXOTH = fs.constants.S_IXOTH + constants.S_IRWXU = fs.constants.S_IRWXU + constants.S_IRWXG = fs.constants.S_IRWXG + constants.S_IRWXO = fs.constants.S_IRWXO + constants.O_WRONLY = fs.constants.O_WRONLY + constants.O_RDONLY = fs.constants.O_RDONLY + constants.O_RDWR = fs.constants.O_RDWR + constants.O_CREAT = fs.constants.O_CREAT + constants.O_TRUNC = fs.constants.O_TRUNC +} + +const { + S_IFBLK, + S_IFCHR, + S_IFIFO, + S_IFMT , + S_IFDIR, + S_IFREG, + S_IRUSR, + S_IWUSR, + S_IXUSR, + S_IRGRP, + S_IWGRP, + S_IXGRP, + S_IROTH, + S_IWOTH, + S_IXOTH, + S_IRWXU, + S_IRWXG, + S_IRWXO, + O_WRONLY, + O_RDONLY, + O_RDWR, + O_CREAT, + O_TRUNC +} = constants + +const encoder = new TextEncoder() +const decoder = new TextDecoder() +globalThis.decode_utf8 = (bytes, off, sz) => { + return decoder.decode(bytes.subarray(off, off + sz)) +} + +const AD = "\u001b[0m" // ANSI Default +const AG = "\u001b[32m" // ANSI Green +const AY = "\u001b[33m" // ANSI Yellow +const AC = "\u001b[36m" // ANSI Cyan +// END OF COMPAT + +// SRV4 ASCII CPIO Format + +// https://github.com/libyal/dtformats/blob/main/documentation/Copy%20in%20and%20out%20(CPIO)%20archive%20format.asciidoc#5-mode-permissions-and-type +/* +0170000 This masks the file type bits. +0140000 File type value for sockets. +0120000 File type value for symbolic links. For symbolic links, + the link body is stored as file data. +0100000 File type value for regular files. +0060000 File type value for block special devices. +0040000 File type value for directories. +0020000 File type value for character special devices. +0010000 File type value for named pipes or FIFOs. +0004000 SUID bit. +0002000 SGID bit. +0001000 Sticky bit. On some systems, this modifies the behavior + of executables and/or directories. +0000777 The lower 9 bits specify read/write/execute permissions + for world, group, and user following standard POSIX con- + ventions. +*/ + +function get_file_type (val) { + const type = val & IF_TYPE + if (type === IF_SOCK) return 'sck' + if (type === IF_LINK) return 'sym' + if (type === IF_REG) return 'reg' + if (type === IF_BLK) return 'blk' + if (type === IF_DIR) return 'dir' + if (type === IF_CHR) return 'chr' + if (type === IF_PIPE) return 'pip' + return '' +} + +function get_bits (val) { + const suid = val & IF_SUID + const sgid = val & IF_SGID + const sticky = val & IF_STICKY + return { suid, sgid, sticky } +} + +function perms (p) { + const { r, w, x } = mode + return `${(p & r) === r ? 'r' : '-'}${(p & w) === w ? 'w' : '-'}${(p & x) === x ? 'x' : '-'}` +} + +function get_perms (val) { + const perm = val & IF_PERM + const u = perm >> 6 + const g = (perm >> 3) & 0x07 + const w = perm & 0x07 + return [u, g, w].map(perms) +} + +function parse_cpio (bytes) { + function octal (sz) { + const val = Number(`0o${decode_utf8(bytes, off, sz)}`) + off += sz + return val + } + + function hex (sz) { + const val = Number(`0x${decode_utf8(bytes, off, sz)}`) + off += sz + return val + } + + function string (sz) { + const str = decode_utf8(bytes, off, sz) + off += sz + 1 + return str + } + + function align () { + const over = off % 4 + if (over === 0) return + off += 4 - over + } + + function buffer (sz) { + const buf = bytes.subarray(off, off + sz) + off += sz + return buf + } + + let off = 0 + const files = [] + + while (off < bytes.length) { + // can be "070701" (no checksums) or "070702" (with checksums) + const id = octal(6) + if (id !== 29121 && id !== 29122) throw new Error('Unrecognized file id') + const inode = hex(8) + const mode = hex(8) + const type = get_file_type(mode) + const perms = get_perms(mode) + const { suid, sgid, sticky } = get_bits(mode) + const uid = hex(8) + const gid = hex(8) + const links = hex(8) + const mod = new Date(hex(8) * 1000) + const size = hex(8) + const major = hex(8) + const minor = hex(8) + const dev_major = hex(8) + const dev_minor = hex(8) + const path_size = hex(8) + const checksum = hex(8) // will only be set if id is "070702" + const path = string(path_size - 1) + if (path === 'TRAILER!!!') break + const file = { + id, inode, mode, uid, gid, links, mod, size, major, minor, dev_major, + dev_minor, path_size, checksum, path, type, perms, + suid, sgid, sticky + } + align() + if (type === 'link') { + file.link_path = string(size) + } else { + file.data = buffer(size) + } + align() + files.push(file) + } + return files +} + +function build_cpio (entries) { + function octal (n, sz) { + const str = n.toString(8).padStart(sz, '0') + off += sz + return str + } + + function hex (n, sz) { + const str = n.toString(16).padStart(sz, '0') + off += sz + return str + } + + function string (s) { + const str = `${s}\0` + off += str.length // TODO - UTF8 + return str + } + + function align () { + const over = off % 4 + if (over === 0) return + off += 4 - over + } + + function buffer (b) { + off += b.length + return b + } + + function get_type (entry) { + const { type } = entry + if (type === 'reg') return S_IFREG + if (type === 'dir') return S_IFDIR + if (type === 'blk') return S_IFBLK + if (type === 'chr') return S_IFCHR + return S_IFREG + } + + function get_perms (entry) { + const { type, exe } = entry + if (type === 'reg') { + if (exe) return S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IXOTH + return S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH + } + if (type === 'dir') return S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH + if (type === 'blk') return S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH + if (type === 'chr') return S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH + return 0 + } + + function get_size (entry) { + const { type } = entry + if (type === 'reg') { + const st = stat(entry.source) + return st.size + } + return 0 + } + + function get_dev (entry) { + if (entry.type !== 'chr' && entry.type !== 'blk') return { major: 0, minor: 0 } + const [ major, minor ] = entry.dev.split('.').map(v => parseInt(v, 10)) + return { major, minor } + } + function create_entry (entry) { + off = 0 + const id = octal(29121, 6) + const inode = hex(next_inode++, 8) + const mode = hex(get_perms(entry) | get_type(entry), 8) + const uid = hex(0, 8) + const gid = hex(0, 8) + const links = hex(0, 8) + const mod = hex(Math.floor(Date.now() / 1000), 8) + const size = hex(get_size(entry), 8) + const dev = get_dev(entry) + const major = hex(8, 8) + const minor = hex(1, 8) + const dev_major = hex(dev.major, 8) + const dev_minor = hex(dev.minor, 8) + const path_size = hex(entry.path.length + 1, 8) + const checksum = hex(0, 8) + const path = string(entry.path) + let payload + align() + if (entry.type === 'link') { + payload = encoder.encode(string(entry.link_path)) + } else if (entry.type === 'reg') { + payload = buffer(readFileSync(entry.source)) + } + align() + const dest = new Uint8Array(off) + const text = `${id}${inode}${mode}${uid}${gid}${links}${mod}${size}${major}${minor}${dev_major}${dev_minor}${path_size}${checksum}${path}` + const written = encoder.encodeInto(text, dest) + off = written + align() + if (payload) dest.set(payload, off) + return dest + } + + const sections = [] + let off = 0 + let next_inode = 1 + for (const entry of entries) { + sections.push(create_entry(entry)) + } + sections.push(create_entry({ path: 'TRAILER!!!' })) + return sections +} + +function col (type, perms) { + if (type === 'reg') { + if (perms) { + const executable = perms.map(p => p.split('')[2]).includes('x') + if (executable) return AG + } + return AD + } + if (type === 'dir') return AC + if (type === 'link') return AG + if (type === 'sock') return AG + if (type === 'chr') return AY + return AY +} + +function header () { + const fields = [] + fields.push('path'.padEnd(40, ' ')) + fields.push('type'.padEnd(6, ' ')) + fields.push('inode'.padEnd(10, ' ')) + fields.push('size'.padStart(20, ' ')) + fields.push('modified'.padStart(30, ' ')) + fields.push('perm'.padStart(10, ' ')) + fields.push('ver'.padStart(6, ' ')) + fields.push('dev'.padStart(6, ' ')) + fields.push('uid'.padStart(8, ' ')) + fields.push('gid'.padStart(8, ' ')) + fields.push('links'.padStart(6, ' ')) + fields.push('suid'.padStart(4, ' ')) + fields.push('sgid'.padStart(4, ' ')) + fields.push('stky'.padStart(4, ' ')) + return `${AG}${fields.join(' ')}${AD}\n${'-'.repeat(168)}` +} + +function dump_file (file) { + const { + path, inode, type, size, mod, perms, major, minor, dev_major, dev_minor, uid, gid, links, + suid, sgid, sticky + } = file + const fields = [] + fields.push(`${col(type, perms)}${path.padEnd(40, ' ')}${AD}`) + fields.push(`${type.padEnd(6, ' ')}`) + fields.push(`${inode.toString().padEnd(10, ' ')}`) + fields.push(`${size.toString().padStart(20, ' ')}`) + fields.push(`${AY}${mod.toISOString().padStart(30, ' ')}${AD}`) + fields.push(`${perms.join('').padStart(10, ' ')}`) + + fields.push(`${(major + "." + minor).padStart(6, ' ')}`) + fields.push(`${(dev_major + "." + dev_minor).padStart(6, ' ')}`) + fields.push(`${uid.toString().padStart(8, ' ')}`) + fields.push(`${gid.toString().padStart(8, ' ')}`) + fields.push(`${links.toString().padStart(6, ' ')}`) + fields.push(`${suid.toString().padStart(4, ' ')}`) + fields.push(`${sgid.toString().padStart(4, ' ')}`) + fields.push(`${sticky.toString().padStart(4, ' ')}`) + return fields.join(' ') +} + +const mode = { x: 1, w: 2, r: 4 } +const IF_TYPE = 0o170000 +const IF_SOCK = 0o140000 +const IF_LINK = 0o120000 +const IF_REG = 0o100000 +const IF_BLK = 0o060000 +const IF_DIR = 0o040000 +const IF_CHR = 0o020000 +const IF_PIPE = 0o010000 +const IF_SUID = 0o004000 +const IF_SGID = 0o002000 +const IF_STICKY = 0o001000 +const IF_PERM = 0o000777 + +function dump_cpio (path) { + const files = parse_cpio(readFileSync(path)) + let total = 0 + console.log(header()) + for (const file of files) { + console.log(dump_file(file)) + total += file.size + } + console.log(`\ntotal: ${total}`) +} + +export { parse_cpio, build_cpio, dump_cpio } diff --git a/lib/ffi.js b/lib/ffi.js index 54c0e8b..a62b786 100644 --- a/lib/ffi.js +++ b/lib/ffi.js @@ -178,7 +178,58 @@ function platform_x64 () { return compiler.compile(asm.bytes()) } - return { compile_slowcall, compile_fastcall } + function generate_real_callback (ctx, { result, parameters, callback }) { + const u32 = new Uint32Array(ctx.buffer) + const i32 = new Int32Array(ctx.buffer) + const u64 = new BigUint64Array(ctx.buffer) + const source = [] + if (result === 'u32') { + source.push(`u32[4] = callback(`) + } else if (result === 'i32') { + source.push(`u32[4] = callback(`) + } else { + source.push(`callback(`) + } + let off = 24 + for (const param of parameters) { + if (off > 24) source.push(', ') + if (param === 'u32') { + source.push(`u32[${off / 4}]`) + } else if (param === 'pointer') { + source.push(`Number(u64[${off / 8}])`) + } + off += 8 + } + source.push(')\n') + return (new Function('i32', 'u32', 'u64', 'callback', `return function () {\n${source.join('')}\n}`))(i32, u32, u64, callback) + } + + function generate_callback (def) { + const { parameters, result } = def + const nArgs = parameters.length + if (nArgs > 6) throw new Error('more than 6 arguments not yet implemented') + const ctx = ptr(new Uint8Array(((nArgs + 3) * 8))) + const callback_address = assert(dlsym(0, 'lo_callback')) + lo.register_callback(ctx.ptr, generate_real_callback(ctx, def)) + asm.reset() + .movabs(ctx.ptr, rax) + if (nArgs > 0) asm.movdest(rdi, rax, 24) + if (nArgs > 1) asm.movdest(rsi, rax, 32) + if (nArgs > 2) asm.movdest(rdx, rax, 40) + if (nArgs > 3) asm.movdest(rcx, rax, 48) + if (nArgs > 4) asm.movdest(r8, rax, 56) + if (nArgs > 5) asm.movdest(r9, rax, 64) + asm.movreg(rax, rdi) + .push(r15) + .movreg(rax, r15) + .call(callback_address) + if (result && result !== 'void') asm.movsrc(r15, rax, 16) + asm.pop(r15) + .ret() + return { context: ctx, fn: compiler.compile(asm.bytes()) } + } + + return { compile_slowcall, compile_fastcall, generate_callback } } function platform_arm64 () { @@ -233,7 +284,11 @@ function platform_arm64 () { return compiler.compile(asm.bytes()) } - return { compile_slowcall, compile_fastcall } + function generate_callback () { + throw new Error('Not Implemented') + } + + return { compile_slowcall, compile_fastcall, generate_callback } } function platform_specific () { @@ -245,13 +300,13 @@ function platform_specific () { return {} } -const { compile_slowcall, compile_fastcall } = platform_specific() +const { compile_slowcall, compile_fastcall, generate_callback } = platform_specific() -function bindall (api, addr = 0) { - const binding = {} +function bindall (api, addr = 0, constants = {} ) { + const binding = { ...constants } for (const key of Object.keys(api)) { - const { name, result, parameters } = api[key] - binding[key] = bind(assert(dlsym(addr, name || key)), result, parameters) + const { name, result, parameters, nofast } = api[key] + binding[key] = bind(assert(dlsym(addr, name || key)), result, parameters, nofast) } return binding } @@ -286,7 +341,7 @@ function bind (address, res = 'void', params = [], slow = false, fast_address = const generated_fun = slow ? bind_slowcall(state.ptr) : bind_fastcall(state.ptr) // keep the state alive - generated_fun._state = state + generated_fun.state = state generated_fun.slow_src = slow_src generated_fun.fast_src = fast_src // return generated_fun @@ -320,7 +375,7 @@ function bind_custom (res = 'void', params = [], slow_address = 0, fast_address const generated_fun = fast_address ? bind_fastcall(state.ptr) : bind_slowcall(state.ptr) // keep the state alive - generated_fun._state = state + generated_fun.state = state // return generated_fun return needs_unwrap(result) ? wrap(result_handle, generated_fun, params.length) : generated_fun @@ -330,7 +385,7 @@ const { ptr, core, wrap, assert } = lo const { bind_fastcall, bind_slowcall, dlsym, struct_fastcall_size } = core -const { rdi, rsi, rdx, rcx, r8, r9, rsp, rax, rbx } = Registers +const { rdi, rsi, rdx, rcx, r8, r9, rsp, rax, rbx, r15 } = Registers // maximum number of args we can handle - this is arbitrary const max_args = 30 // the offset in struct fastcall where we place the function pointer for the @@ -349,4 +404,49 @@ const Types = { u32array: 17, bool: 18, string: 19 } -export { bind, bindall, bind_custom } +class Struct { + #u8 + #u32 + #u64 + #off = 0 + #size = 0 + + constructor (size = 64) { + const buf = new ArrayBuffer(size) + this.#size = size + this.#u8 = ptr(new Uint8Array(buf)) + this.#u64 = new BigUint64Array(buf) + this.#u32 = new Uint32Array(buf) + this.#off = 0 + } + + u32 (val) { + this.#u32[this.#off / 4] = val + this.#off += 4 + return this + } + + u64 (val) { + this.#u64[this.#off / 8] = BigInt(val) + this.#off += 8 + return this + } + + up (i) { + if (this.#off + i > this.#size) throw new Error('OOB') + this.#off += i + return this + } + + down (i) { + if (this.#off - i < 0) throw new Error('OOB') + this.#off -= i + return this + } + + get bytes () { + return this.#u8 + } +} + +export { bind, bindall, bind_custom, generate_callback, Struct } diff --git a/lib/fs.js b/lib/fs.js index b0d898b..d759269 100644 --- a/lib/fs.js +++ b/lib/fs.js @@ -4,7 +4,7 @@ const { F_OK, O_RDONLY, S_IFMT, S_IFDIR, S_IFREG, S_IRWXU, S_IRWXG, NAME_MAX, O_WRONLY, O_CREAT, O_TRUNC, S_IRUSR, S_IWUSR, S_IRGRP, S_IROTH, - DT_DIR, DT_CHR, DT_REG, DT_FIFO, DT_LNK, opendir, readdir + DT_DIR, DT_CHR, DT_REG, DT_FIFO, DT_LNK, DT_BLK, opendir, readdir } = core const u8 = ptr(new Uint8Array(21)) @@ -31,9 +31,7 @@ function checkMode (val, mode) { return (val & S_IFMT) === mode } -function file_size (path) { - const fd = open(path, O_RDONLY) - assert(fd > 0, `failed to open ${path}`) +function file_size_fd (fd) { assert(fstat(fd, stat.ptr) === 0) let size = 0 if (core.os === 'mac') { @@ -41,10 +39,61 @@ function file_size (path) { } else { size = Number(st[6]) } + return size +} + +function file_mode_fd (fd) { + assert(fstat(fd, stat.ptr) === 0) + return stat32[MODE_WORD] +} + +function file_size (path) { + const fd = open(path, O_RDONLY) + assert(fd > 0, `failed to open ${path}`) + const size = file_size_fd(fd) close(fd) return size } +/* +offset size field +------------------------------------ +0 8 st_dev +8 8 st_ino +16 8 st_nlink +24 4 st_mode +28 4 st_uid +32 4 st_gid +36 4 padding +40 8 st_rdev +48 8 st_size +56 8 st_blksize +64 8 st_blocks +72 16 st_atim +88 16 st_mtim +104 16 st_ctim +------------------------------------ +total: 144 bytes +alignment: 8 bytes +*/ +function file_stat (path) { + assert(core.stat(path, stat.ptr) === 0) + const dev = Number(st[0]) // 0 + const ino = Number(st[1]) // 8 + const nlink = stat32[4] // 16 + const mode = stat32[6] // 16 + const uid = stat32[7] // 32 + const gid = stat32[8] // 36 + const rdev = Number(st[5]) // 40 + const size = Number(st[6]) // 48 + const blksize = Number(st[7]) // 56 + const blocks = Number(st[8]) // 64 + const atim = [st[9], st[10]] // 72 + const mtim = [st[11], st[12]] // 88 + const ctim = [st[13], st[14]] // 104 + return { dev, ino, mode, nlink, uid, gid, rdev, size, blksize, blocks, atim, mtim, ctim } +} + function readdir_sync (path, entries = [], options = default_options) { const dir = opendir(path) let next = readdir(dir) @@ -54,12 +103,14 @@ function readdir_sync (path, entries = [], options = default_options) { if (!(entry.name === '..' || entry.name === '.')) { const entry_path = `${path}/${entry.name}` if (entry.d_type === DT_DIR) { - entries.push({ path, name: entry_path, isDirectory: true }) + entries.push({ path, name: entry.name, isDirectory: true }) if (options.recursive) readdir_sync(entry_path, entries, options) } else if (entry.d_type === DT_REG) { entries.push({ path, name: entry.name, isFile: true }) } else if (entry.d_type === DT_CHR) { entries.push({ path, name: entry.name, isChar: true }) + } else if (entry.d_type === DT_BLK) { + entries.push({ path, name: entry.name, isBlock: true }) } else if (entry.d_type === DT_LNK) { const path_name = ptr(new Uint8Array(1024)) const len = core.readlink(entry_path, path_name.ptr, 1024) @@ -191,5 +242,5 @@ export { mkDirAll, rmDirAll, isFile, isDir, readEntry, write_flags, read_flags, write_mode, dir_flags, is_dir, is_file, mkdir_all, rmdir_all, mkdir_all_safe, file_size, - readdir_sync, read_entry + readdir_sync, read_entry, file_size_fd, file_mode_fd, file_stat } diff --git a/lib/gen.js b/lib/gen.js index 19ec833..d2a8dd0 100644 --- a/lib/gen.js +++ b/lib/gen.js @@ -226,7 +226,7 @@ function bindings ({ api, includes = [], name, preamble, constants, structs = [] } function initStruct(n) { - return ` SET_VALUE(isolate, module, "struct_${n}_size", Integer::New(isolate, sizeof(${n})));\n` + return ` SET_VALUE(isolate, module, "struct_${n.replace(/\s/g, '_')}_size", Integer::New(isolate, sizeof(${n})));\n` } function initFunction (n, api) { @@ -648,7 +648,7 @@ async function gen (args) { } // source += await linkerScript('main.js') for (const fileName of args.slice(next)) { - source += await linkerScript(fileName) + source += await linkerScript(fileName, lo.getcwd()) } } else if (args[0] === '--header') { let next = 1 @@ -667,7 +667,7 @@ async function gen (args) { } else { source = bindings(await import(args[0])) } - console.log(source) + return source } export { diff --git a/lib/hash.js b/lib/hash.js index 5f4b8e4..4b6b912 100644 --- a/lib/hash.js +++ b/lib/hash.js @@ -5,17 +5,14 @@ if (lo.getenv('LOSSL') === 'boringssl') { libssl = lo.load('libssl').libssl } -const { assert, ptr, wrap } = lo +const { encode } = lo.load('encode') + +const { assert, ptr, utf8_decode } = lo const sizes = { md5: 16, sha1: 20, sha256: 32, sha384: 48, sha512: 64 } -const handle = new Uint32Array(2) - -libssl.EVP_get_digestbyname = wrap(handle, libssl.EVP_get_digestbyname, 1) -libssl.EVP_MD_CTX_new = wrap(handle, libssl.EVP_MD_CTX_new, 0) - const { EVP_get_digestbyname, EVP_MD_CTX_new, EVP_DigestInit_ex, EVP_DigestUpdateBuffer, EVP_DigestFinal, EVP_MD_CTX_reset, EVP_Digest, @@ -28,10 +25,10 @@ class Digest { constructor (method = 'md5') { const size = sizes[method] this.method = method - this.hasher = EVP_get_digestbyname(method) - this.hsize = new Uint32Array(2) + this.hasher = assert(EVP_get_digestbyname(method)) + this.hsize = ptr(new Uint32Array(2)) this.digest = ptr(new Uint8Array(size)) - this.ctx = EVP_MD_CTX_new() + this.ctx = assert(EVP_MD_CTX_new()) } init () { @@ -39,12 +36,12 @@ class Digest { } update (buf) { - assert(EVP_DigestUpdateBuffer(this.ctx, buf, buf.length) === 1) + assert(EVP_DigestUpdateBuffer(this.ctx, ptr(buf).ptr, buf.length) === 1) } finish () { const { hsize, digest, ctx } = this - assert(EVP_DigestFinal(ctx, digest, hsize) === 1) + assert(EVP_DigestFinal(ctx, digest.ptr, hsize.ptr) === 1) EVP_MD_CTX_reset(ctx) return digest } @@ -52,8 +49,8 @@ class Digest { hash (buf) { const { hasher, hsize, digest, ctx } = this assert(EVP_DigestInit_ex(ctx, hasher, 0) === 1) - assert(EVP_DigestUpdateBuffer(ctx, buf, buf.length) === 1) - assert(EVP_DigestFinal(ctx, digest, hsize) === 1) + assert(EVP_DigestUpdateBuffer(ctx, ptr(buf).ptr, buf.length) === 1) + assert(EVP_DigestFinal(ctx, digest.ptr, hsize.ptr) === 1) EVP_MD_CTX_reset(ctx) return digest } @@ -62,7 +59,7 @@ class Digest { const { hasher, hsize, digest, ctx } = this assert(EVP_DigestInit_ex(ctx, hasher, 0) === 1) assert(EVP_DigestUpdateString(ctx, str) === 1) - assert(EVP_DigestFinal(ctx, digest, hsize) === 1) + assert(EVP_DigestFinal(ctx, digest.ptr, hsize.ptr) === 1) EVP_MD_CTX_reset(ctx) return digest } @@ -71,16 +68,22 @@ class Digest { const { hasher, hsize, digest, ctx } = this assert(EVP_DigestInit_ex(ctx, hasher, 0) === 1) assert(EVP_DigestUpdate(ctx, c_str.ptr, c_str.size) === 1) - assert(EVP_DigestFinal(ctx, digest, hsize) === 1) + assert(EVP_DigestFinal(ctx, digest.ptr, hsize.ptr) === 1) EVP_MD_CTX_reset(ctx) return digest } hashonce (buf) { const { hasher, hsize, digest } = this - assert(EVP_Digest(buf, buf.length, digest, hsize, hasher, 0) === 1) + assert(EVP_Digest(ptr(buf).ptr, buf.length, digest.ptr, hsize.ptr, hasher, 0) === 1) return digest } } -export { Digest } +function hex_encode (digest) { + const hex_encoded = ptr(new Uint8Array(digest.length * 2)) + const size = encode.hex_encode(digest.ptr, digest.length, hex_encoded.ptr, hex_encoded.length) + return utf8_decode(hex_encoded.ptr, size) +} + +export { Digest, hex_encode } diff --git a/lib/md4c/api.js b/lib/md4c/api.js new file mode 100644 index 0000000..2db0a6a --- /dev/null +++ b/lib/md4c/api.js @@ -0,0 +1,144 @@ +const api = { + parse: { + parameters: ['string', 'u32', 'pointer', 'pointer'], + pointers: ['const MD_CHAR*',, 'const MD_PARSER*'], + result: 'i32', + name: 'md_parse' + }, + html: { + parameters: ['string', 'u32', 'pointer', 'pointer', 'u32', 'u32'], + pointers: ['const MD_CHAR*', , 'process_output'], + result: 'i32', + name: 'md_html' + }, + to_html: { + parameters: ['string', 'u32', 'pointer'], + pointers: ['const MD_CHAR*', , 'HtmlBuffer*'], + result: 'i32', + } +} + +// https://bun.com/blog/bun-v1.3.8 + +const constants = { + MD_FLAG_COLLAPSEWHITESPACE: 'i32', + MD_DIALECT_GITHUB: 'i32', + MD_DIALECT_COMMONMARK: 'i32', + + MD_BLOCK_DOC: 'i32', + MD_BLOCK_QUOTE: 'i32', + MD_BLOCK_UL: 'i32', + MD_BLOCK_OL: 'i32', + MD_BLOCK_LI: 'i32', + MD_BLOCK_HR: 'i32', + MD_BLOCK_H: 'i32', + MD_BLOCK_CODE: 'i32', + MD_BLOCK_HTML: 'i32', + MD_BLOCK_P: 'i32', + MD_BLOCK_TABLE: 'i32', + MD_BLOCK_THEAD: 'i32', + MD_BLOCK_TBODY: 'i32', + MD_BLOCK_TR: 'i32', + MD_BLOCK_TH: 'i32', + MD_BLOCK_TD: 'i32', + + MD_SPAN_EM: 'i32', + MD_SPAN_STRONG: 'i32', + MD_SPAN_A: 'i32', + MD_SPAN_IMG: 'i32', + MD_SPAN_CODE: 'i32', + MD_SPAN_DEL: 'i32', + MD_SPAN_LATEXMATH: 'i32', + MD_SPAN_LATEXMATH_DISPLAY: 'i32', + MD_SPAN_WIKILINK: 'i32', + MD_SPAN_U: 'i32', + + MD_TEXT_NORMAL: 'i32', + MD_TEXT_NULLCHAR: 'i32', + MD_TEXT_BR: 'i32', + MD_TEXT_SOFTBR: 'i32', + MD_TEXT_ENTITY: 'i32', + MD_TEXT_CODE: 'i32', + MD_TEXT_HTML: 'i32', + MD_TEXT_LATEXMATH: 'i32', + + MD_ALIGN_DEFAULT: 'i32', + MD_ALIGN_LEFT: 'i32', + MD_ALIGN_CENTER: 'i32', + MD_ALIGN_RIGHT: 'i32', + + MD_FLAG_COLLAPSEWHITESPACE: 'i32', + MD_FLAG_PERMISSIVEATXHEADERS: 'i32', + MD_FLAG_PERMISSIVEURLAUTOLINKS: 'i32', + MD_FLAG_PERMISSIVEEMAILAUTOLINKS: 'i32', + MD_FLAG_NOINDENTEDCODEBLOCKS: 'i32', + MD_FLAG_NOHTMLBLOCKS: 'i32', + MD_FLAG_NOHTMLSPANS: 'i32', + MD_FLAG_TABLES: 'i32', + MD_FLAG_STRIKETHROUGH: 'i32', + MD_FLAG_PERMISSIVEWWWAUTOLINKS: 'i32', + MD_FLAG_TASKLISTS: 'i32', + MD_FLAG_LATEXMATHSPANS: 'i32', + MD_FLAG_WIKILINKS: 'i32', + MD_FLAG_UNDERLINE: 'i32', + MD_FLAG_HARD_SOFT_BREAKS: 'i32', + MD_FLAG_PERMISSIVEAUTOLINKS: 'i32', + MD_FLAG_NOHTML: 'i32', + + MD_HTML_FLAG_DEBUG: 'i32', + MD_HTML_FLAG_VERBATIM_ENTITIES: 'i32', + MD_HTML_FLAG_SKIP_UTF8_BOM: 'i32', + MD_HTML_FLAG_XHTML: 'i32', + + +} +const includes = ['md4c.h', 'md4c-html.h'] +const name = 'md4c' +const libs = [] +const obj = ['deps/md4c/build/src/libmd4c.a', 'deps/md4c/build/src/libmd4c-html.a'] +const include_paths = ['deps/md4c/src'] +const structs = [ + 'MD_ATTRIBUTE', + 'MD_BLOCK_UL_DETAIL', + 'MD_BLOCK_OL_DETAIL', + 'MD_BLOCK_LI_DETAIL', + 'MD_BLOCK_H_DETAIL', + 'MD_BLOCK_CODE_DETAIL', + 'MD_BLOCK_TABLE_DETAIL', + 'MD_BLOCK_TD_DETAIL', + 'MD_SPAN_A_DETAIL', + 'MD_SPAN_IMG_DETAIL', + 'MD_SPAN_WIKILINK', + 'MD_PARSER', +] +const preamble = ` +typedef void (*process_output)(const MD_CHAR*, MD_SIZE, void*); + +typedef struct { + char* data; + size_t size; + size_t capacity; +} HtmlBuffer; + +void append_to_buffer (const MD_CHAR* text, MD_SIZE size, void* userdata) { + HtmlBuffer* buf = (HtmlBuffer*)userdata; + if (buf->size + size + 1 > buf->capacity) { + size_t new_capacity = buf->capacity ? buf->capacity * 2 : 1024; + while (new_capacity < buf->size + size + 1) new_capacity *= 2; + char* new_data = (char*)realloc(buf->data, new_capacity); + if (!new_data) return; + buf->data = new_data; + buf->capacity = new_capacity; + } + memcpy(buf->data + buf->size, text, size); + buf->size += size; +} + +int to_html (const MD_CHAR* text, MD_SIZE size, HtmlBuffer* html) { + html->size = 0; + return md_html(text, size, append_to_buffer, html, 0, 0); +} + +` + +export { api, includes, name, obj, libs, constants, include_paths, structs, preamble } diff --git a/lib/md4c/build.js b/lib/md4c/build.js new file mode 100644 index 0000000..939f743 --- /dev/null +++ b/lib/md4c/build.js @@ -0,0 +1,37 @@ +import { fetch } from 'lib/curl.js' +import { inflate } from 'lib/inflate.js' +import { untar } from 'lib/untar.js' +import { isDir, isFile } from 'lib/fs.js' +import { exec } from 'lib/proc.js' +import { obj } from 'lib/md4c/api.js' + +async function build () { + const { assert, core } = lo + const { + chdir, mkdir, S_IRWXU, S_IRWXG, S_IROTH, S_IXOTH, readFile + } = core + if (!isDir('deps/md4c')) { + mkdir('deps', S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) + assert(chdir('deps') === 0) + if (!isFile('md4c.tar.gz')) { + console.log('fetching release') + fetch('https://github.com/mity/md4c/archive/refs/tags/release-0.5.2.tar.gz', + 'md4c.tar.gz') + } + const bytes = readFile('md4c.tar.gz') + const dir_name = untar(inflate(bytes)) + const cwd = lo.getcwd() + assert(lo.core.rename(`${cwd}/${dir_name}`, `${cwd}/md4c`) === 0) + assert(chdir('../') === 0) + } + if (obj.some(o => !isFile(o))) { + assert(chdir('deps/md4c') === 0) + assert(exec('cmake', ['-DBUILD_SHARED_LIBS=ON', '-B', 'build'])[0] === 0) + assert(exec('make', ['-C', 'build', '-j', '6'])[0] === 0) + assert(exec('cmake', ['-DBUILD_SHARED_LIBS=OFF', '-B', 'build'])[0] === 0) + assert(exec('make', ['-C', 'build', '-j', '6'])[0] === 0) + assert(chdir('../../') === 0) + } +} + +export { build } diff --git a/lib/proc.js b/lib/proc.js index 462436a..190f540 100644 --- a/lib/proc.js +++ b/lib/proc.js @@ -1,10 +1,10 @@ -const { ptr, core, assert } = lo +const { ptr, core, assert, load } = lo const { setenv } = core const noop = () => {} -let mem = noop +let mem = () => 0 let exec = noop let exec_path_env = noop let exec_env = noop @@ -52,9 +52,24 @@ if (core.os === 'linux') { assert(task_info(task_self(), TASK_BASIC_INFO, info.ptr, msg_type.ptr) === KERN_SUCCESS) return info[3] } +} else if (core.os === 'win') { + const { win } = load('win') + const { getProcessMemoryInfo } = win + const process_info = ptr(new BigUint64Array(9)) + mem = () => { + assert(getProcessMemoryInfo(process_info.ptr, process_info.byteLength)) + return Number(process_info[2]) + } } -if (core.os === 'linux' || core.os === 'mac') { +if (core.os === 'win') { + const { win } = lo.load('win') + const { createProcess } = win + + exec = (name, vargs, status = new Int32Array(2)) => { + createProcess([name, ...vargs].join(' ')) + } +} else if (core.os === 'linux' || core.os === 'mac') { const { fork, execvp, execve, waitpid, times, _SC_CLK_TCK, sysconf } = lo.core const { cstr, ptr } = lo diff --git a/lib/repl.js b/lib/repl.js index 1bb16aa..c8e8952 100644 --- a/lib/repl.js +++ b/lib/repl.js @@ -5,41 +5,15 @@ import { control } from 'lib/ansi.js' import { dump } from 'lib/binary.js' const boot_time = Math.floor((lo.hrtime() - lo.start) / 10000) / 100 +const { + core, assert, version, handle_error, ptr, colors +} = lo +const { + write, arch, os, getchar, read_file +} = core -const { bestlines } = lo.load('bestlines') -const { colors, utf8_decode, wrap, core, handle_error, ptr } = lo -const { strnlen, isatty } = core - -const { AG, AD, AR, AY, AM } = colors - -const encoder = new TextEncoder() -const u32 = new Uint32Array(2) - -const { bestline, bestline_raw } = bestlines -//const bestline = wrap(u32, bestlines.bestline, 1) -//const bestline_raw = wrap(u32, bestlines.bestline_raw, 3) -const { cls, add, save, load } = bestlines -const { STDIN, STDOUT, STDERR } = core - -const history_path = join(core.homedir, '.lo_history') - -load(history_path) -const prompt = ptr(encoder.encode(`${AG}>${AD} \0`)) -const async_fn = Object.getPrototypeOf(async function() {}) - -function on_unhandled_rejection (err) { - //console.error(`${AR}Unhandled Rejection${AD}`) - //console.error(err.stack) -} - -globalThis.onUnhandledRejection = on_unhandled_rejection - -function info () { - console.log(` ${AG}lo${AD} ${lo.version.lo} ${control.column(26)}${AG}v8${AD} ${lo.version.v8} - ${AM}arch${AD} ${lo.core.arch} ${control.column(26)}${AM}os${AD} ${lo.core.os} - ${AY}boot${AD} ${boot_time} ms ${control.column(26)}${AY}rss${AD} ${proc.mem()} -`) -} +const decoder = new TextDecoder() +let repl function logo () { console.log(`⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛ @@ -62,75 +36,199 @@ function logo () { ⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛ `) } -const MAX_LINE = 65536 - -function bestline_notatty (p) { - return bestline(p) -} -function bestline_isatty (p) { - return bestline_raw(p, STDIN, STDOUT) -} +if (os === 'win') { + const { column, cls } = control + const { exec, mem } = proc + const async_fn = Object.getPrototypeOf(async function() {}) + const { AG, AD, AY, AM } = colors + const encoder = new TextEncoder() + const decoder = new TextDecoder() + const prompt = ptr(encoder.encode(`${AG}>${AD} \0`)) + + function info () { + console.log(` ${AG}lo${AD} ${version.lo} ${column(26)}${AG}v8${AD} ${version.v8} + ${AM}arch${AD} ${arch} ${control.column(26)}${AM}os${AD} ${os} + ${AY}boot${AD} ${boot_time} ms ${column(26)}${AY}rss${AD} ${mem()} + `) + } -let nextline = (isatty(STDIN) && isatty(STDOUT)) ? bestline_isatty : bestline_notatty - -async function repl (ctx) { -// cls(1) - logo() - info() - let line - globalThis.repl = ctx - while (line = nextline(prompt.ptr)) { - try { - const len = strnlen(line, MAX_LINE) - if (len === 0) continue - const command = utf8_decode(line, len) - if (!command) continue - if (command === '.exit') break - if (command === '.save') { - save(history_path) - continue - } - if (command === '.cls') { - cls(1) - continue - } - if (command === '.info') { - info() - add(line) - continue + async function handle_command (command) { + if (!command) return + if (command[0] === '!') { + const [cmd, ...args] = command.slice(1).split(' ') + exec(cmd, args) + return + } + if (command === '.cls') { + cls(1) + return + } + if (command === '.info') { + info() + return + } + const result = await async_fn.constructor(`return (${command})`) + .call(this, command) + if (result !== null && result !== undefined) { + if (result === null) { + console.log('') + } else if (result === undefined) { + console.log('') + } else if (!result.constructor) { + console.log(stringify(result)) + } else if (result.constructor.name === 'Number') { + console.log(result) + } else if (result.constructor.name === 'String') { + console.log(`${result}`) + } else if (ArrayBuffer.isView(result)) { + const { buffer, byteOffset, length } = result + console.log(dump(new Uint8Array(buffer, byteOffset, length))) + } else { + console.log(stringify(result)) } - if (command[0] === '!') { - const [cmd, ...args] = command.slice(1).split(' ') - proc.exec(cmd, args) - add(line) + } + } + + repl = async function () { + const max_len = 65536 +// logo() + info() + const buffer = new Uint8Array(max_len) + let n = 0 + write(1, prompt.ptr, prompt.length) + while (true) { + if (n === max_len) { + console.log('line is too long') + n = 0 continue } - const result = await async_fn.constructor(`return (${command})`).call(this, command) - if (result !== null && result !== undefined) { - if (result === null) { - console.log('') - } else if (result === undefined) { - console.log('') - } else if (!result.constructor) { - console.log(stringify(result)) - } else if (result.constructor.name === 'Number') { - console.log(result) - } else if (result.constructor.name === 'String') { - console.log(`${result}`) - } else if (ArrayBuffer.isView(result)) { - console.log(dump(new Uint8Array(result.buffer, result.byteOffset, result.byteLength))) - } else { - console.log(stringify(result)) + const c = buffer[n++] = getchar() + if (c === 0) break + if (c === 10) { + const command = decoder.decode(buffer.subarray(0, n)).trim() + if (command === '.exit') break + try { + await handle_command(command) + } catch (err) { + handle_error(err) } + n = 0 + write(1, prompt.ptr, prompt.length) } - } catch (err) { - handle_error(err) } - add(line) } - save(history_path) +} else { + const { utf8_decode, wrap } = lo + const { strnlen, isatty } = core + const { bestlines } = lo.load('bestlines') + + const { AG, AD, AR, AY, AM } = colors + + const encoder = new TextEncoder() + const u32 = new Uint32Array(2) + + const { bestline, bestline_raw } = bestlines + //const bestline = wrap(u32, bestlines.bestline, 1) + //const bestline_raw = wrap(u32, bestlines.bestline_raw, 3) + const { cls, add, save, load } = bestlines + const { STDIN, STDOUT, STDERR } = core + + const history_path = join(core.homedir, '.lo_history') + + load(history_path) + const prompt = ptr(encoder.encode(`${AG}>${AD} \0`)) + const async_fn = Object.getPrototypeOf(async function() {}) + + function on_unhandled_rejection (err) { + //console.error(`${AR}Unhandled Rejection${AD}`) + //console.error(err.stack) + } + + globalThis.onUnhandledRejection = on_unhandled_rejection + + function info () { + console.log(` ${AG}lo${AD} ${lo.version.lo} ${control.column(26)}${AG}v8${AD} ${lo.version.v8} + ${AM}arch${AD} ${lo.core.arch} ${control.column(26)}${AM}os${AD} ${lo.core.os} + ${AY}boot${AD} ${boot_time} ms ${control.column(26)}${AY}rss${AD} ${proc.mem()} + `) + } + + const MAX_LINE = 65536 + + function bestline_notatty (p) { + return bestline(p) + } + + function bestline_isatty (p) { + return bestline_raw(p, STDIN, STDOUT) + } + + let nextline = (isatty(STDIN) && isatty(STDOUT)) ? bestline_isatty : bestline_notatty + + repl = async function (ctx) { + // cls(1) + // logo() + info() + let line + globalThis.repl = ctx + while (line = nextline(prompt.ptr)) { + try { + const len = strnlen(line, MAX_LINE) + if (len === 0) continue + const command = utf8_decode(line, len) + if (!command) continue + if (command === '.exit') break + if (command === '.save') { + save(history_path) + continue + } + if (command === '.cls') { + cls(1) + continue + } + if (command === '.history') { + console.log(decoder.decode(read_file(history_path))) + continue + } + if (command === '.info') { + info() + add(line) + continue + } + if (command[0] === '!') { + const [cmd, ...args] = command.slice(1).split(' ') + proc.exec(cmd, args) + add(line) + continue + } + const result = await async_fn.constructor(`return (${command})`).call(this, command) + if (result !== null && result !== undefined) { + if (result === null) { + console.log('') + } else if (result === undefined) { + console.log('') + } else if (!result.constructor) { + console.log(stringify(result)) + } else if (result.constructor.name === 'Number') { + console.log(result) + } else if (result.constructor.name === 'String') { + console.log(`${result}`) + } else if (ArrayBuffer.isView(result)) { + console.log(dump(new Uint8Array(result.buffer, result.byteOffset, result.byteLength))) + } else { + console.log(stringify(result)) + } + } + } catch (err) { + handle_error(err) + } + add(line) + } + + save(history_path) + } } export { repl } diff --git a/lib/sqlite.js b/lib/sqlite.js index b63e041..a68fc2d 100644 --- a/lib/sqlite.js +++ b/lib/sqlite.js @@ -90,8 +90,8 @@ class Blob { } open (table, col, row, flags = BLOB_WRITABLE, database = 'main') { - const bh = new Uint32Array(2) - assert(sqlite.blob_open(this.#db, database, table, col, row, flags, bh) === 0) + const bh = ptr(new Uint32Array(2)) + assert(sqlite.blob_open(this.#db, database, table, col, row, flags, bh.ptr) === 0) this.#handle = addr(bh) return this } @@ -168,7 +168,7 @@ class Statement { } bindBlob (index = 0, u8) { - return bind_blob(this.stmt, index, u8, u8.length, 0) + return bind_blob(this.stmt, index, u8.ptr, u8.length, 0) } columnInt (index = 0) { diff --git a/lib/sqlite/api.js b/lib/sqlite/api.js index 374f772..ccd160c 100644 --- a/lib/sqlite/api.js +++ b/lib/sqlite/api.js @@ -8,25 +8,25 @@ const api = { }, open: { name: 'sqlite3_open', - parameters: ['pointer', 'u32array'], + parameters: ['pointer', 'pointer'], pointers: ['const char*', 'sqlite3 **'], result: 'i32' }, open2: { name: 'sqlite3_open_v2', - parameters: ['string', 'u32array', 'i32', 'pointer'], + parameters: ['string', 'pointer', 'i32', 'pointer'], pointers: ['const char*', 'sqlite3 **', , 'const char*'], result: 'i32' }, exec: { name: 'sqlite3_exec', - parameters: ['pointer', 'string', 'pointer', 'pointer', 'u32array'], + parameters: ['pointer', 'string', 'pointer', 'pointer', 'pointer'], pointers: ['sqlite3*', 'const char*', 'callback',, 'char**'], result: 'i32' }, exec2: { name: 'sqlite3_exec', - parameters: ['pointer', 'string', 'pointer', 'pointer', 'u32array'], + parameters: ['pointer', 'string', 'pointer', 'pointer', 'pointer'], pointers: ['sqlite3*', 'const char*', 'callback',, 'char**'], result: 'i32', nofast: true @@ -59,7 +59,7 @@ const api = { }, prepare2: { name: 'sqlite3_prepare_v2', - parameters: ['pointer', 'string', 'i32', 'u32array', 'pointer'], + parameters: ['pointer', 'string', 'i32', 'pointer', 'pointer'], pointers: ['sqlite3*', 'const char*', ,'sqlite3_stmt **', 'const char**'], result: 'i32' }, @@ -128,7 +128,7 @@ const api = { }, bind_blob: { name: 'sqlite3_bind_blob', - parameters: ['pointer', 'i32', 'buffer', 'i32', 'u64'], + parameters: ['pointer', 'i32', 'pointer', 'i32', 'u64'], casts: [, , , , '(sqlite3_destructor_type)'], pointers: ['sqlite3_stmt*', , 'const void*'], result: 'i32' @@ -167,7 +167,7 @@ const api = { }, blob_open: { name: 'sqlite3_blob_open', - parameters: ['pointer', 'string', 'string', 'string', 'i64', 'i32', 'u32array'], + parameters: ['pointer', 'string', 'string', 'string', 'i64', 'i32', 'pointer'], pointers: ['sqlite3*', , , , , , 'sqlite3_blob**'], result: 'i32' }, @@ -179,7 +179,7 @@ const api = { }, blob_read: { name: 'sqlite3_blob_read', - parameters: ['pointer', 'buffer', 'i32', 'i32'], + parameters: ['pointer', 'pointer', 'i32', 'i32'], pointers: ['sqlite3_blob*'], result: 'i32' }, @@ -191,20 +191,20 @@ const api = { }, blob_write: { name: 'sqlite3_blob_write', - parameters: ['pointer', 'buffer', 'i32', 'i32'], + parameters: ['pointer', 'pointer', 'i32', 'i32'], pointers: ['sqlite3_blob*'], result: 'i32' }, serialize: { name: 'sqlite3_serialize', - parameters: ['pointer', 'string', 'u32array', 'u32'], + parameters: ['pointer', 'string', 'pointer', 'u32'], pointers: ['sqlite3*', , 'sqlite3_int64*'], result: 'pointer', rpointer: 'unsigned char*' }, deserialize: { name: 'sqlite3_deserialize', - parameters: ['pointer', 'string', 'buffer', 'u32', 'u32', 'u32'], + parameters: ['pointer', 'string', 'pointer', 'u32', 'u32', 'u32'], pointers: ['sqlite3*', , 'unsigned char*'], result: 'i32' }, @@ -252,7 +252,7 @@ const obj = ['deps/sqlite/libsqlite3.a'] const constants = { SQLITE_OPEN_READWRITE: 'i32', SQLITE_OPEN_PRIVATECACHE: 'i32', SQLITE_ROW: 'i32', SQLITE_OPEN_NOMUTEX: 'i32', SQLITE_OPEN_CREATE: 'i32', - SQLITE_OK: 'i32', SQLITE_OPEN_READONLY: 'i32' + SQLITE_OK: 'i32', SQLITE_OPEN_READONLY: 'i32', SQLITE_DONE: 'i32' } const include_paths = ['deps/sqlite'] diff --git a/lib/tuntap.js b/lib/tuntap.js index d11432f..f9d8cdc 100644 --- a/lib/tuntap.js +++ b/lib/tuntap.js @@ -6,9 +6,12 @@ const { IFF_TUN, IFF_TAP, IFF_NO_PI, IFF_UP, IFF_DOWN, SIOCSIFFLAGS, SIOCSIFADDR, SIOCSIFNETMASK, TUNSETIFF, TUNSETPERSIST, AF_INET, SOCK_DGRAM, O_NONBLOCK } = net.constants -const { assert, core } = lo +const { assert, core, ptr, load } = lo const { open, fcntl } = core const { strerror } = system +const { netlink } = load('netlink') + +const { set_address, device_up, device_down, RTM_NEWADDR, RTM_DELADDR } = netlink const O_RDWR = 2 @@ -17,11 +20,11 @@ const encoder = new TextEncoder() // todo: create /dev/net/tun if it doesn't exist function device_ctrl (fd, iff, type = IFF_TAP | IFF_NO_PI, flags = TUNSETIFF) { - const ifreq = new Uint8Array(40) + const ifreq = ptr(new Uint8Array(40)) encoder.encodeInto(iff.slice(0, 16), ifreq) ifreq[16] = type & 0xff ifreq[17] = (type >> 8) & 0xff - return ioctl(fd, flags, ifreq) + return ioctl(fd, flags, ifreq.ptr) } class Device { @@ -57,23 +60,27 @@ class Device { } setAddress (addr, cidr) { + netlink.set_address(RTM_NEWADDR, this.#iff, addr, cidr) + } + + setAddress2 (addr, cidr) { const iff = this.#iff const fd = this.#fd - const ifreq = new Uint8Array(40) + const ifreq = ptr(new Uint8Array(40)) const dv = new DataView(ifreq.buffer) ifreq.fill(0) encoder.encodeInto(iff.slice(0, 16), ifreq) ifreq[16] = AF_INET & 0xff ifreq[17] = (AF_INET >> 8) & 0xff dv.setUint32(20, inet_aton(addr)) - assert(ioctl(fd, SIOCSIFADDR, ifreq) === 0, strerror) + assert(ioctl(fd, SIOCSIFADDR, ifreq.ptr) === 0, strerror) ifreq.fill(0) encoder.encodeInto(iff.slice(0, 16), ifreq) ifreq[16] = AF_INET & 0xff ifreq[17] = (AF_INET >> 8) & 0xff let netmask = 0xffffffff - (0xffffffff >>> cidr) dv.setUint32(20, netmask) - assert(ioctl(fd, SIOCSIFNETMASK, ifreq) === 0, strerror) + assert(ioctl(fd, SIOCSIFNETMASK, ifreq.ptr) === 0, strerror) } up () { @@ -84,6 +91,11 @@ class Device { assert(device_ctrl(this.#fd, this.#iff, IFF_DOWN, SIOCSIFFLAGS) === 0, strerror) } + close () { + close(this.#fd) + close(this.#dev) + } + } export { Device } diff --git a/lib/win/api.js b/lib/win/api.js new file mode 100644 index 0000000..2af41f5 --- /dev/null +++ b/lib/win/api.js @@ -0,0 +1,13 @@ +const api = { + test: { + parameters: [], + result: 'i32', + name: 'test' + } +} + +const constants = {} +const includes = [] +const name = 'win' + +export { api, includes, name, constants } diff --git a/lib/win/win.cc b/lib/win/win.cc new file mode 100644 index 0000000..9bc16d9 --- /dev/null +++ b/lib/win/win.cc @@ -0,0 +1,322 @@ +#include +#include +#include +#include +#include + +namespace lo { +namespace win { + +using v8::Local; +using v8::ObjectTemplate; +using v8::Isolate; +using v8::Value; +using v8::FunctionCallbackInfo; +using v8::CTypeInfo; +using v8::CFunctionInfo; +using v8::CFunction; +using v8::String; +using v8::Number; +using v8::BigInt; +using v8::Integer; + +unsigned int testFast(void* p); + +CTypeInfo cargstest[1] = { + CTypeInfo(CTypeInfo::Type::kV8Value), +}; +CTypeInfo rctest = CTypeInfo(CTypeInfo::Type::kUint32); +CFunctionInfo infotest = CFunctionInfo(rctest, 1, cargstest); +CFunction pFtest = CFunction((const void*)&testFast, &infotest); + +unsigned int testFast(void* p) { + return 1; +} + +void testSlow(const FunctionCallbackInfo &args) { + args.GetReturnValue().Set(1); +} + +// https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-copyfile +void copyFile(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + String::Utf8Value source(isolate, args[0]); + String::Utf8Value dest(isolate, args[1]); + bool ok = CopyFile(*source, *dest, true); + args.GetReturnValue().Set(ok); +} + +// https://learn.microsoft.com/en-us/windows/win32/api/errhandlingapi/nf-errhandlingapi-getlasterror +// https://learn.microsoft.com/en-us/windows/win32/debug/system-error-codes +// https://learn.microsoft.com/en-us/windows/win32/debug/retrieving-the-last-error-code +void getLastError(const FunctionCallbackInfo &args) { + args.GetReturnValue().Set(Number::New(args.GetIsolate(), GetLastError())); +} + +// https://learn.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-closehandle +void closeHandle (const FunctionCallbackInfo & args) { + uint32_t v0 = Local::Cast(args[0])->Value(); + HANDLE file = reinterpret_cast(v0); + BOOL ok = CloseHandle(file); + if (ok) { + args.GetReturnValue().Set(true); + return; + } + args.GetReturnValue().Set(false); +} + +// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getfilesize +void getFileSize (const FunctionCallbackInfo & args) { + Isolate *isolate = args.GetIsolate(); + uint32_t v0 = Local::Cast(args[0])->Value(); + HANDLE file = reinterpret_cast(v0); + DWORD fileSize = GetFileSize(file, NULL); + if (fileSize == INVALID_FILE_SIZE) { + args.GetReturnValue().Set(-1); + return; + } + args.GetReturnValue().Set(Number::New(isolate, fileSize)); +} + +// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getfiletype +void getFileType (const FunctionCallbackInfo & args) { + Isolate *isolate = args.GetIsolate(); + uint32_t v0 = Local::Cast(args[0])->Value(); + HANDLE file = reinterpret_cast(v0); + DWORD fileType = GetFileType(file); + args.GetReturnValue().Set(Number::New(isolate, fileType)); +} + +// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-readfile +void readFile (const FunctionCallbackInfo & args) { + Isolate *isolate = args.GetIsolate(); + uint32_t v0 = Local::Cast(args[0])->Value(); + char* buffer = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + uint32_t len = Local::Cast(args[2])->Value(); + // HANDLE's *should* be 32 bit safe - reference? + HANDLE file = reinterpret_cast(v0); + DWORD bytesRead; + BOOL ok = ReadFile(file, buffer, len, &bytesRead, NULL); + if (ok) { + args.GetReturnValue().Set(Number::New(isolate, bytesRead)); + return; + } + args.GetReturnValue().Set(-1); +} + +// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-writefile +void writeFile (const FunctionCallbackInfo & args) { + Isolate *isolate = args.GetIsolate(); + uint32_t v0 = Local::Cast(args[0])->Value(); + char* buffer = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + uint32_t len = Local::Cast(args[2])->Value(); + // HANDLE's *should* be 32 bit safe - reference? + HANDLE file = reinterpret_cast(v0); + DWORD bytesWritten; + BOOL ok = WriteFile(file, buffer, len, &bytesWritten, NULL); + if (ok) { + args.GetReturnValue().Set(Number::New(isolate, bytesWritten)); + return; + } + args.GetReturnValue().Set(-1); +} + +// https://learn.microsoft.com/en-us/windows/win32/fileio/creating-and-opening-files +// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea +void createFile(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + String::Utf8Value path(isolate, args[0]); + uint32_t access = Local::Cast(args[1])->Value(); + uint32_t mode = Local::Cast(args[2])->Value(); + HANDLE file = CreateFile(*path, access, 0, NULL, mode, FILE_ATTRIBUTE_NORMAL, NULL); + if (file == INVALID_HANDLE_VALUE) { + args.GetReturnValue().Set(-1); + return; + } + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(file))); +} + +// https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-getenvironmentvariable +void getEnv(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + String::Utf8Value name(isolate, args[0]); + char* buffer = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + uint32_t len = Local::Cast(args[2])->Value(); + args.GetReturnValue().Set(Number::New(isolate, GetEnvironmentVariable(*name, buffer, len))); +} + +// https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setenvironmentvariable +void setEnv(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + String::Utf8Value name(isolate, args[0]); + String::Utf8Value value(isolate, args[1]); + BOOL ok = SetEnvironmentVariable(*name, *value); + if (ok) { + args.GetReturnValue().Set(true); + return; + } + args.GetReturnValue().Set(false); +} + +// https://learn.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-loadlibrarya +void loadLibrary(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + String::Utf8Value path(isolate, args[0]); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(LoadLibraryA(*path)))); +} + +// https://learn.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-freelibrary +void freeLibrary(const FunctionCallbackInfo &args) { + uint64_t v0 = (uint64_t)Local::Cast(args[0])->Value(); + HMODULE handle = reinterpret_cast(v0); + BOOL ok = FreeLibrary(handle); + if (ok) { + args.GetReturnValue().Set(true); + return; + } + args.GetReturnValue().Set(false); +} + +// https://learn.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-getprocaddress +void getProcAddress(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + uint64_t v0 = (uint64_t)Local::Cast(args[0])->Value(); + String::Utf8Value name(isolate, args[1]); + HMODULE handle = reinterpret_cast(v0); + FARPROC fp = GetProcAddress(handle, *name); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(fp))); +} + +// https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/isatty?view=msvc-170 +void isatty(const FunctionCallbackInfo &args) { + uint32_t fd = Local::Cast(args[0])->Value(); + if (_isatty(fd) == 0) { + args.GetReturnValue().Set(false); + return; + } + args.GetReturnValue().Set(true); +} + +// https://learn.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-getprocessmemoryinfo +void getProcessMemoryInfo(const FunctionCallbackInfo &args) { + //uint32_t v0 = Local::Cast(args[0])->Value(); + //HANDLE pid = reinterpret_cast(v0); + PROCESS_MEMORY_COUNTERS* counter = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + DWORD size = Local::Cast(args[1])->Value(); + BOOL ok = GetProcessMemoryInfo(GetCurrentProcess(), counter, size); + if (ok) { + args.GetReturnValue().Set(true); + return; + } + args.GetReturnValue().Set(false); +} + +// https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getcurrentprocess +void getCurrentProcess(const FunctionCallbackInfo &args) { + HANDLE pid = GetCurrentProcess(); + if (pid == INVALID_HANDLE_VALUE) { + args.GetReturnValue().Set(-1); + return; + } + args.GetReturnValue().Set(Number::New(args.GetIsolate(), reinterpret_cast(pid))); +} + +// https://learn.microsoft.com/en-us/windows/win32/procthread/creating-processes +// https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa +void createProcess(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + STARTUPINFO si; + PROCESS_INFORMATION pi; + ZeroMemory( &si, sizeof(si) ); + si.cb = sizeof(si); + ZeroMemory( &pi, sizeof(pi) ); + String::Utf8Value cmdline(isolate, args[0]); + LPSTR szCmdline = _tcsdup(TEXT(*cmdline)); + if( !CreateProcess( NULL, // No module name (use command line) + szCmdline, // Command line + NULL, // Process handle not inheritable + NULL, // Thread handle not inheritable + FALSE, // Set handle inheritance to FALSE + 0, // No creation flags + NULL, // Use parent's environment block + NULL, // Use parent's starting directory + &si, // Pointer to STARTUPINFO structure + &pi ) // Pointer to PROCESS_INFORMATION structure + ) + { + printf( "CreateProcess failed (%lu).\n", GetLastError() ); + return; + } + WaitForSingleObject( pi.hProcess, INFINITE ); + CloseHandle( pi.hProcess ); + CloseHandle( pi.hThread ); +} + +void Init(Isolate *isolate, Local target) { + Local module = ObjectTemplate::New(isolate); + + SET_METHOD(isolate, module, "testSlow", testSlow); + SET_FAST_METHOD(isolate, module, "test", &pFtest, testSlow); + + SET_METHOD(isolate, module, "getLastError", getLastError); + + SET_METHOD(isolate, module, "createFile", createFile); + SET_METHOD(isolate, module, "getFileSize", getFileSize); + SET_METHOD(isolate, module, "getFileType", getFileType); + SET_METHOD(isolate, module, "copyFile", copyFile); + SET_METHOD(isolate, module, "readFile", readFile); + SET_METHOD(isolate, module, "writeFile", writeFile); + SET_METHOD(isolate, module, "closeHandle", closeHandle); + + SET_METHOD(isolate, module, "loadLibrary", loadLibrary); + SET_METHOD(isolate, module, "getProcAddress", getProcAddress); + SET_METHOD(isolate, module, "freeLibrary", freeLibrary); + + SET_METHOD(isolate, module, "getenv", getEnv); + SET_METHOD(isolate, module, "setenv", setEnv); + + SET_METHOD(isolate, module, "isatty", isatty); + + SET_METHOD(isolate, module, "getProcessMemoryInfo", getProcessMemoryInfo); + SET_METHOD(isolate, module, "getCurrentProcess", getCurrentProcess); + SET_METHOD(isolate, module, "createProcess", createProcess); + + SET_VALUE(isolate, module, "GENERIC_READ", Integer::New(isolate, (int32_t)GENERIC_READ)); + SET_VALUE(isolate, module, "GENERIC_WRITE", Integer::New(isolate, (int32_t)GENERIC_WRITE)); + + SET_VALUE(isolate, module, "FILE_SHARE_READ", Integer::New(isolate, (int32_t)FILE_SHARE_READ)); + SET_VALUE(isolate, module, "FILE_SHARE_WRITE", Integer::New(isolate, (int32_t)FILE_SHARE_WRITE)); + + SET_VALUE(isolate, module, "CREATE_ALWAYS", Integer::New(isolate, (int32_t)CREATE_ALWAYS)); + SET_VALUE(isolate, module, "CREATE_NEW", Integer::New(isolate, (int32_t)CREATE_NEW)); + SET_VALUE(isolate, module, "OPEN_ALWAYS", Integer::New(isolate, (int32_t)OPEN_ALWAYS)); + SET_VALUE(isolate, module, "OPEN_EXISTING", Integer::New(isolate, (int32_t)OPEN_EXISTING)); + SET_VALUE(isolate, module, "TRUNCATE_EXISTING", Integer::New(isolate, (int32_t)TRUNCATE_EXISTING)); + + SET_VALUE(isolate, module, "FILE_ATTRIBUTE_NORMAL", Integer::New(isolate, (int32_t)FILE_ATTRIBUTE_NORMAL)); + SET_VALUE(isolate, module, "FILE_ATTRIBUTE_READONLY", Integer::New(isolate, (int32_t)FILE_ATTRIBUTE_READONLY)); + SET_VALUE(isolate, module, "FILE_ATTRIBUTE_TEMPORARY", Integer::New(isolate, (int32_t)FILE_ATTRIBUTE_TEMPORARY)); + + SET_VALUE(isolate, module, "FILE_TYPE_CHAR", Integer::New(isolate, (int32_t)FILE_TYPE_CHAR)); + SET_VALUE(isolate, module, "FILE_TYPE_DISK", Integer::New(isolate, (int32_t)FILE_TYPE_DISK)); + SET_VALUE(isolate, module, "FILE_TYPE_PIPE", Integer::New(isolate, (int32_t)FILE_TYPE_PIPE)); + SET_VALUE(isolate, module, "FILE_TYPE_REMOTE", Integer::New(isolate, (int32_t)FILE_TYPE_REMOTE)); + SET_VALUE(isolate, module, "FILE_TYPE_UNKNOWN", Integer::New(isolate, (int32_t)FILE_TYPE_UNKNOWN)); + + SET_VALUE(isolate, module, "INVALID_HANDLE_VALUE", Integer::New(isolate, -1)); + + SET_VALUE(isolate, module, "STDOUT", Integer::New(isolate, _fileno(stdout))); + SET_VALUE(isolate, module, "STDERR", Integer::New(isolate, _fileno(stderr))); + SET_VALUE(isolate, module, "STDIN", Integer::New(isolate, _fileno(stdin))); + + SET_MODULE(isolate, target, "win", module); +} + +} // namespace win +} // namespace lo + +extern "C" { + void* _register_win() { + return (void*)lo::win::Init; + } +} diff --git a/lo.cc b/lo.cc index 81df341..ff8a9eb 100644 --- a/lo.cc +++ b/lo.cc @@ -1,6 +1,5 @@ #include #include "lo.h" -#include using v8::String; using v8::FunctionCallbackInfo; @@ -59,17 +58,16 @@ using v8::Script; using v8::HeapStatistics; using v8::BigUint64Array; -// TODO: thread safety +#ifdef _WIN32 +static uint64_t hrtime_frequency_ = 0; +#else +int random_fd = -1; +#endif + std::map builtins; std::map modules; std::unique_ptr platform; -#ifndef _WIN64 -clock_t clock_id = CLOCK_MONOTONIC; -#endif - -struct timespec t; - CTypeInfo cargshrtime[2] = { CTypeInfo(CTypeInfo::Type::kV8Value), CTypeInfo(CTypeInfo::Type::kUint64) @@ -111,18 +109,6 @@ CFunctionInfo infoutf8encodeinto = CFunctionInfo(rcutf8encodeinto, 3, CFunction pFutf8encodeinto = CFunction((const void*)&lo::fastUtf8EncodeInto, &infoutf8encodeinto); -/* -CTypeInfo cargsutf8encodeintoPtr[3] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kSeqOneByteString), - CTypeInfo(CTypeInfo::Type::kUint64) -}; -CFunctionInfo infoutf8encodeintoPtr = CFunctionInfo(rcutf8encodeinto, 3, - cargsutf8encodeintoPtr); -CFunction pFutf8encodeintoPtr = CFunction((const void*)&lo::fastUtf8EncodeIntoPtr, - &infoutf8encodeintoPtr); -*/ - CTypeInfo cargsutf8encodeintoatoffset[4] = { CTypeInfo(CTypeInfo::Type::kV8Value), CTypeInfo(CTypeInfo::Type::kSeqOneByteString), @@ -958,6 +944,7 @@ void lo::fastSetErrno (void* p, int32_t e) { uint64_t lo::hrtime() { #ifdef __MACH__ // OS X does not have clock_gettime, use clock_get_time + struct timespec t; clock_serv_t cclock; mach_timespec_t mts; host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); @@ -965,12 +952,28 @@ uint64_t lo::hrtime() { mach_port_deallocate(mach_task_self(), cclock); t.tv_sec = mts.tv_sec; t.tv_nsec = mts.tv_nsec; + return (t.tv_sec * (uint64_t) 1e9) + t.tv_nsec; #elif defined(_WIN32) - // TODO + // stolen from libuv: https://github.com/libuv/libuv/blob/v1.x/src/win/util.c + LARGE_INTEGER counter; + double scaled_freq; + double result; + if (hrtime_frequency_ == 0) { + LARGE_INTEGER perf_frequency; + if (QueryPerformanceFrequency(&perf_frequency)) { + hrtime_frequency_ = perf_frequency.QuadPart; + } + if (hrtime_frequency_ == 0) return 0; + } + if (!QueryPerformanceCounter(&counter)) return 0; + scaled_freq = (double) hrtime_frequency_ / 1000000000; + result = (double) counter.QuadPart / scaled_freq; + return (uint64_t) result; #else - if (clock_gettime(clock_id, &t)) return 0; -#endif + struct timespec t; + if (clock_gettime(CLOCK_MONOTONIC, &t)) return 0; return (t.tv_sec * (uint64_t) 1e9) + t.tv_nsec; +#endif } void lo::HRTime(const FunctionCallbackInfo &args) { @@ -1418,9 +1421,6 @@ void lo::Exit(const FunctionCallbackInfo &args) { exit(status); } -// keep the /dev/urandom file open for lifetime of process -int random_fd = -1; - /** * fill the provided buffer with random bytes * @@ -1432,11 +1432,17 @@ int random_fd = -1; * @param length Write this number of random bytes, no more, no less. */ bool EntropySource(unsigned char* buffer, size_t length) { +#ifdef _WIN32 +// https://learn.microsoft.com/en-us/windows/win32/api/Bcrypt/nf-bcrypt-bcryptgenrandom + NTSTATUS status = BCryptGenRandom(NULL, buffer, length, BCRYPT_USE_SYSTEM_PREFERRED_RNG); + if (status != 0) return false; + return true; +#else if (random_fd == -1) random_fd = open("/dev/urandom", O_RDONLY); - //todo check return size_t bytes = read(random_fd, buffer, length); if (bytes != length) return false; return true; +#endif } void lo::Setup( @@ -1664,7 +1670,9 @@ void lo_shutdown (int cleanup) { V8::Dispose(); platform.reset(); } +#ifndef _WIN32 close(random_fd); +#endif builtins.clear(); modules.clear(); } diff --git a/lo.h b/lo.h index 8533d7a..17c993a 100644 --- a/lo.h +++ b/lo.h @@ -13,24 +13,10 @@ #endif #if defined _WIN32 || defined __CYGWIN__ - #ifdef BUILDING_DLL - #ifdef __GNUC__ - #define DLL_PUBLIC __attribute__ ((dllexport)) - #else - #define DLL_PUBLIC __declspec(dllexport) // Note: actually gcc seems to also supports this syntax. - #endif - #else - #ifdef __GNUC__ - #define DLL_PUBLIC __attribute__ ((dllimport)) - #else - #define DLL_PUBLIC __declspec(dllimport) // Note: actually gcc seems to also supports this syntax. - #endif - #endif - #define DLL_LOCAL -#else - #define DLL_PUBLIC __attribute__ ((visibility ("default"))) - #define DLL_LOCAL __attribute__ ((visibility ("hidden"))) +#include #endif +#define DLL_PUBLIC __attribute__ ((visibility ("default"))) +#define DLL_LOCAL __attribute__ ((visibility ("hidden"))) namespace lo { /* @@ -269,7 +255,7 @@ struct callback_state { }; DLL_PUBLIC void lo_callback (exec_info* info); -void lo_async_callback (exec_info* info, callback_state* state); +DLL_PUBLIC void lo_async_callback (exec_info* info, callback_state* state); DLL_PUBLIC void lo_shutdown (int cleanup); diff --git a/main.js b/main.js index 6c925a4..2dc3f22 100644 --- a/main.js +++ b/main.js @@ -32,7 +32,7 @@ class TextDecoder { decode (u8) { // todo: result cache if (!u8.ptr) ptr(u8) - return utf8Decode(u8.ptr, u8.size) + return utf8Decode(u8.ptr, u8.length) } } @@ -85,13 +85,13 @@ function wrap (handle, fn, plen = 0) { function ptr (u8) { if (u8.ptr) return u8 u8.ptr = get_address(u8) - u8.size = u8.byteLength // TODO: this is not right? +// u8.size = u8.byteLength // TODO: this is not right? return u8 } function cstr (str) { const buf = ptr(encoder.encode(`${str}\0`)) - buf.size = buf.size - 1 +// buf.size = buf.size - 1 return buf } @@ -104,20 +104,25 @@ function check_mode (val, mode) { } function is_file (path) { - const fd = open(path, O_RDONLY) + const fd = open(path, defaultReadFlags) if (fd <= 2) return false if (fstat(fd, stat.ptr) !== 0) return false close(fd) + if (core.os === 'win') { + return check_mode(stat16[3], S_IFREG) + } return check_mode(stat32[MODE_WORD], S_IFREG) } -function read_file (path, flags = O_RDONLY, size = 0) { +function read_file (path, flags = defaultReadFlags, size = 0) { const fd = open(path, flags) assert(fd > 0, `failed to open ${path} with flags ${flags}`) if (size === 0) { assert(fstat(fd, stat.ptr) === 0) if (core.os === 'mac') { size = Number(st[12]) + } else if (core.os === 'win') { + size = stat32[5] } else { size = Number(st[6]) } @@ -144,7 +149,6 @@ function write_file (path, u8, flags = defaultWriteFlags, for (let i = 0, off = 0; i < chunks; ++i, off += 4096) { const towrite = Math.min(len - off, 4096) bytes = write(fd, u8.ptr + off, towrite); - //bytes = write(fd, u8.subarray(off, off + towrite), towrite) if (bytes <= 0) break total += bytes } @@ -170,16 +174,19 @@ function load (name) { return lib } // todo: we leak this handle - need to be able to unload - if (!core.dlopen) return - // RTLD_LOCAL is the default - const handle = core.dlopen(`lib/${name}/${name}.so`, RTLD_LAZY) || - core.dlopen(`${LO_HOME}/lib/${name}/${name}.so`, RTLD_LAZY) - if (!handle) return - const sym = core.dlsym(handle, `_register_${name}`) - if (!sym) return - lib = library(sym) - lib.handle = handle - if (!lib) return + if (core.os === 'win') { + // TODO + return + } else { + const handle = core.dlopen(`lib/${name}/${name}.so`, RTLD_LAZY) || + core.dlopen(`${LO_HOME}/lib/${name}/${name}.so`, RTLD_LAZY) + if (!handle) return + const sym = core.dlsym(handle, `_register_${name}`) + if (!sym) return + lib = library(sym) + lib.handle = handle + if (!lib) return + } lib.fileName = `lib/${name}/${name}.so` libCache.set(name, lib) return lib @@ -370,7 +377,10 @@ function get_address (buf) { return addr(handle) } -const MAX_ENV = 65536 // maximum environment variable size - todo +const handle = new Uint32Array(2) +core.os = lo.os() +core.arch = lo.arch() +const MAX_ENV = core.os === 'win' ? 32767 : 65536 // maximum environment variable size - todo const MAX_DIR = 65536 // maximum path len - todo const isatty = core.isatty(STDOUT) const AD = isatty ? '\u001b[0m' : '' // ANSI Default @@ -382,16 +392,23 @@ const AB = isatty ? '\u001b[34m' : '' // ANSI Blue const AM = isatty ? '\u001b[35m' : '' // ANSI Magenta const AC = isatty ? '\u001b[36m' : '' // ANSI Cyan const AW = isatty ? '\u001b[37m' : '' // ANSI White -const defaultWriteFlags = O_WRONLY | O_CREAT | O_TRUNC -const defaultWriteMode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH +let defaultReadFlags = O_RDONLY +let defaultWriteFlags = O_WRONLY | O_CREAT | O_TRUNC +let defaultWriteMode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH +if (core.os === 'win') { + defaultWriteFlags = O_WRONLY | O_CREAT | O_TRUNC | core._O_BINARY + defaultWriteMode = core._S_IWRITE + defaultReadFlags = O_RDONLY | core._O_BINARY +} core.defaultWriteFlags = defaultWriteFlags core.defaultWriteMode = defaultWriteMode const encoder = new TextEncoder() const decoder = new TextDecoder() -const handle = new Uint32Array(2) handle.ptr = get_address(handle) +//const env_buf = ptr(new Uint8Array(MAX_ENV)) const stat = ptr(new Uint8Array(160)) const stat32 = new Uint32Array(stat.buffer) +const stat16 = new Uint16Array(stat.buffer) const st = new BigUint64Array(stat.buffer) const moduleCache = new Map() const requireCache = new Map() @@ -430,7 +447,10 @@ lo.addr = addr lo.core = core // todo: should we just overwrite the existing ones and not put these on "lo"? lo.getenv = wrap_getenv() -lo.setenv = lo.core.setenv +if (core.os !== 'win') { + // TODO + lo.setenv = lo.core.setenv +} lo.getcwd = wrap_getcwd() const LO_HOME = lo.getenv('LO_HOME') || lo.getcwd() const LO_CACHE = parseInt(lo.getenv('LO_CACHE') || '0', 10) @@ -450,8 +470,6 @@ core.write_file = write_file core.little_endian = little_endian() // todo: optimize this - return numbers and make a single call to get both -core.os = lo.os() -core.arch = lo.arch() const MODE_WORD = core.arch === 'arm64' ? 4 : 6 const _builtins = lo.builtins() lo.builtins = () => _builtins @@ -516,7 +534,6 @@ lo.unwrap_memory = lo.unwrapMemory lo.utf8_decode = lo.utf8Decode lo.utf8_encode = lo.utf8Encode lo.utf8_encode_into = lo.utf8EncodeInto -lo.utf8_encode_into_ptr = lo.utf8EncodeIntoPtr lo.utf8_encode_into_at_offset = lo.utf8EncodeIntoAtOffset lo.utf8_length = lo.utf8Length lo.wrap_memory = lo.wrapMemory @@ -613,7 +630,8 @@ async function global_main () { const command = args[1] try { if (command === 'gen') { - await (await import('lib/gen.js')).gen(args.slice(2)) + const src = await (await import('lib/gen.js')).gen(args.slice(2)) + console.log(src) } else if (command === 'build') { //todo: should be awaited await (await import('lib/build.js')).build(args.slice(2)) @@ -655,6 +673,10 @@ if (workerSource) { } // end bootstrap_runtime -bootstrap_runtime() +try { + bootstrap_runtime() +} catch (err) { + lo.print(`${err.stack}\n`) +} export {} diff --git a/main_win.h b/main_win.h index efe3d5a..78b1dcf 100644 --- a/main_win.h +++ b/main_win.h @@ -1,34 +1,36 @@ -#pragma once -// [do not edit,] -// This file has been automatically generated, please do not change unless you disable auto-generation in the Makefile - -#include "lo.h" -#include "builtins.h" - -static unsigned int main_js_len = _binary_main_js_len; - -extern "C" { - extern void* _register_core(); -} - -void register_builtins() { - lo::builtins_add("main.js", _binary_main_js_start, main_js_len); - lo::modules_add("core", &_register_core); -} - -static const char* index_js = NULL; -static unsigned int index_js_len = 0; - -static const char* main_js = _binary_main_js_start; - -static const char* v8flags = "--stack-trace-limit=10 --use-strict --turbo-fast-api-calls --no-freeze-flags-after-init --cppgc-young-generation"; -static unsigned int _v8flags_from_commandline = 1; -static unsigned int _v8_threads = 2; -static unsigned int _v8_cleanup = 0; -static unsigned int _on_exit = 0; -#ifdef __linux__ - -#endif -#ifdef __MACH__ - -#endif +#pragma once +// [do not edit,] +// This file has been automatically generated, please do not change unless you disable auto-generation in the Makefile + +#include "lo.h" + +#include "builtins.h" +static unsigned int main_js_len = _binary_main_js_len; + +extern "C" { + extern void* _register_core(); + extern void* _register_win(); + extern void* _register_inflate(); +} + +void register_builtins() { + lo::builtins_add("main.js", _binary_main_js_start, _binary_main_js_len); + lo::builtins_add("lib/inflate.js", _binary_lib_inflate_js_start, _binary_lib_inflate_js_len); + lo::builtins_add("lib/gen.js", _binary_lib_gen_js_start, _binary_lib_gen_js_len); + lo::builtins_add("lib/path.js", _binary_lib_path_js_start, _binary_lib_path_js_len); + lo::builtins_add("lib/proc.js", _binary_lib_proc_js_start, _binary_lib_proc_js_len); + lo::builtins_add("lib/stringify.js", _binary_lib_stringify_js_start, _binary_lib_stringify_js_len); + lo::builtins_add("lib/binary.js", _binary_lib_binary_js_start, _binary_lib_binary_js_len); + lo::modules_add("core", &_register_core); + lo::modules_add("win", &_register_win); + lo::modules_add("inflate", &_register_inflate); +} +static const char* index_js = NULL; +static unsigned int index_js_len = 0; +static const char* main_js = _binary_main_js_start; +static const char* v8flags = "--stack-trace-limit=10 --use-strict --turbo-fast-api-calls --no-freeze-flags-after-init --cppgc-young-generation"; +static unsigned int _v8flags_from_commandline = 1; +static unsigned int _v8_threads = 2; +static unsigned int _v8_cleanup = 0; +static unsigned int _on_exit = 0; + diff --git a/test.cmd b/test.cmd new file mode 100644 index 0000000..17f653a --- /dev/null +++ b/test.cmd @@ -0,0 +1,4 @@ +set VERSION=0.0.24-pre +set RUNTIME=lo +echo \"%VERSION%\" +echo \"%RUNTIME%\"