From fcc66bb5a1aaf50029c00028ac71760cf228bd05 Mon Sep 17 00:00:00 2001 From: Jim Huang Date: Fri, 16 Mar 2018 20:35:28 +0800 Subject: [PATCH] Indent with clang-format The change introduces new style along with clang-format tool. All *.[ch] files are indented accordingly. Indentation Command: find . -name '*.[ch]' | xargs clang-format -i --- .clang-format | 15 + jni/iri-pearldiver-exlib.c | 29 +- jni/iri-pearldiver-exlib.h | 19 +- src/clcontext.c | 52 +- src/constants.h | 32 +- src/dcurl.c | 41 +- src/hash/curl.c | 112 ++- src/pearl.cl.h | 1921 ++++++++++++++++++------------------ src/pow_cl.c | 151 +-- src/pow_sse.c | 365 ++++--- src/pow_sse.h | 68 +- src/trinary/trinary.c | 46 +- test/test_curl.c | 50 +- test/test_pow_cl.c | 45 +- test/test_pow_sse.c | 47 +- test/test_trinary.c | 7 +- 16 files changed, 1673 insertions(+), 1327 deletions(-) create mode 100644 .clang-format diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..9705d27 --- /dev/null +++ b/.clang-format @@ -0,0 +1,15 @@ +BasedOnStyle: Chromium +Language: Cpp +MaxEmptyLinesToKeep: 3 +IndentCaseLabels: false +AllowShortIfStatementsOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortLoopsOnASingleLine: false +DerivePointerAlignment: false +PointerAlignment: Right +SpaceAfterCStyleCast: true +TabWidth: 4 +UseTab: Never +IndentWidth: 4 +BreakBeforeBraces: Linux +AccessModifierOffset: -4 diff --git a/jni/iri-pearldiver-exlib.c b/jni/iri-pearldiver-exlib.c index 0607774..3b7ff66 100644 --- a/jni/iri-pearldiver-exlib.c +++ b/jni/iri-pearldiver-exlib.c @@ -1,5 +1,5 @@ -#include #include "iri-pearldiver-exlib.h" +#include #include "../src/dcurl.h" #include "../src/trinary/trinary.h" @@ -23,29 +23,34 @@ static jint *char_to_int_array(char *arr, int size) return ret; } -JNIEXPORT jboolean JNICALL Java_com_iota_iri_hash_PearlDiver_exlib_1init(JNIEnv *env, jclass clazz) +JNIEXPORT jboolean JNICALL +Java_com_iota_iri_hash_PearlDiver_exlib_1init(JNIEnv *env, jclass clazz) { dcurl_init(2, 1); return JNI_TRUE; } -JNIEXPORT jboolean JNICALL Java_com_iota_iri_hash_PearlDiver_exlib_1search(JNIEnv *env, jclass clazz, jintArray trits, jint mwm) +JNIEXPORT jboolean JNICALL +Java_com_iota_iri_hash_PearlDiver_exlib_1search(JNIEnv *env, + jclass clazz, + jintArray trits, + jint mwm) { - /* Convert ***INT*** array (TRITS) to ***CHAR*** array (TRYTES) */ + /* Convert ***INT*** array (TRITS) to ***CHAR*** array (TRYTES) */ jint *c_trits = (*env)->GetIntArrayElements(env, trits, NULL); char *char_trits = int_to_char_array(c_trits, 8019); - + Trits_t *arg_trits = initTrits(char_trits, 8019); Trytes_t *arg_trytes = trytes_from_trits(arg_trits); /****************************************************************/ - + Trytes_t *result = dcurl_entry(arg_trytes, mwm); - + /* Convert ***CHAR*** array(TRYTES) to ***INT*** array (TRITS) */ Trits_t *ret_trits = trits_from_trytes(result); jint *int_trits = char_to_int_array(ret_trits->data, 8019); /***************************************************************/ - + /* jintArray returnJNIArray = (*env)->NewIntArray(env, 8019); (*env)->SetIntArrayRegion(env, returnJNIArray, 0, 8019, int_trits); @@ -60,16 +65,18 @@ JNIEXPORT jboolean JNICALL Java_com_iota_iri_hash_PearlDiver_exlib_1search(JNIEn freeTrobject(arg_trits); freeTrobject(arg_trytes); freeTrobject(ret_trits); - + return JNI_TRUE; } -JNIEXPORT void JNICALL Java_com_iota_iri_hash_PearlDiver_exlib_1cancel(JNIEnv *env, jclass clazz) +JNIEXPORT void JNICALL +Java_com_iota_iri_hash_PearlDiver_exlib_1cancel(JNIEnv *env, jclass clazz) { /* Do nothing */ } -JNIEXPORT void JNICALL Java_com_iota_iri_hash_PearlDiver_exlib_1destroy(JNIEnv *env, jclass clazz) +JNIEXPORT void JNICALL +Java_com_iota_iri_hash_PearlDiver_exlib_1destroy(JNIEnv *env, jclass clazz) { dcurl_destroy(); } diff --git a/jni/iri-pearldiver-exlib.h b/jni/iri-pearldiver-exlib.h index 70d0115..ccf3939 100644 --- a/jni/iri-pearldiver-exlib.h +++ b/jni/iri-pearldiver-exlib.h @@ -22,32 +22,35 @@ extern "C" { * Method: exlib_init * Signature: ()Z */ -JNIEXPORT jboolean JNICALL Java_com_iota_iri_hash_PearlDiver_exlib_1init - (JNIEnv *, jclass); +JNIEXPORT jboolean JNICALL +Java_com_iota_iri_hash_PearlDiver_exlib_1init(JNIEnv *, jclass); /* * Class: com_iota_iri_hash_PearlDiver * Method: exlib_search * Signature: ([II)Z */ -JNIEXPORT jboolean JNICALL Java_com_iota_iri_hash_PearlDiver_exlib_1search - (JNIEnv *, jclass, jintArray, jint); +JNIEXPORT jboolean JNICALL +Java_com_iota_iri_hash_PearlDiver_exlib_1search(JNIEnv *, + jclass, + jintArray, + jint); /* * Class: com_iota_iri_hash_PearlDiver * Method: exlib_cancel * Signature: ()V */ -JNIEXPORT void JNICALL Java_com_iota_iri_hash_PearlDiver_exlib_1cancel - (JNIEnv *, jclass); +JNIEXPORT void JNICALL Java_com_iota_iri_hash_PearlDiver_exlib_1cancel(JNIEnv *, + jclass); /* * Class: com_iota_iri_hash_PearlDiver * Method: exlib_destroy * Signature: ()V */ -JNIEXPORT void JNICALL Java_com_iota_iri_hash_PearlDiver_exlib_1destroy - (JNIEnv *, jclass); +JNIEXPORT void JNICALL +Java_com_iota_iri_hash_PearlDiver_exlib_1destroy(JNIEnv *, jclass); #ifdef __cplusplus } diff --git a/src/clcontext.c b/src/clcontext.c index db6d8e3..97d7c53 100644 --- a/src/clcontext.c +++ b/src/clcontext.c @@ -1,6 +1,6 @@ #include "clcontext.h" -#include "pearl.cl.h" #include +#include "pearl.cl.h" void init_cl_devices(CLContext *ctx) { @@ -9,7 +9,7 @@ void init_cl_devices(CLContext *ctx) cl_platform_id *platform; errno = clGetPlatformIDs(0, NULL, &num_platform); - + if (errno != CL_SUCCESS) { printf("Cannot get the number of OpenCL platforms available.\n"); exit(0); @@ -18,35 +18,42 @@ void init_cl_devices(CLContext *ctx) // We only need one Platform platform = (cl_platform_id *) malloc(sizeof(cl_platform_id) * num_platform); clGetPlatformIDs(num_platform, platform, NULL); - + // Get Device IDs cl_uint platform_num_device; - if (clGetDeviceIDs(platform[0], CL_DEVICE_TYPE_GPU, 1, &ctx->device, &platform_num_device) != CL_SUCCESS) { + if (clGetDeviceIDs(platform[0], CL_DEVICE_TYPE_GPU, 1, &ctx->device, + &platform_num_device) != CL_SUCCESS) { printf("Failed to get OpenCL Device IDs for platform.\n"); exit(0); } - + // Create OpenCL context - ctx->context = (cl_context) clCreateContext(NULL, 1, &ctx->device, NULL, NULL, &errno); + ctx->context = + (cl_context) clCreateContext(NULL, 1, &ctx->device, NULL, NULL, &errno); if (errno != CL_SUCCESS) { printf("Failed to create OpenCL Context\n"); exit(0); } // Get Device Info (num_cores) - if (CL_SUCCESS != clGetDeviceInfo(ctx->device, CL_DEVICE_MAX_COMPUTE_UNITS, sizeof(cl_uint), &ctx->num_cores, NULL)) { + if (CL_SUCCESS != clGetDeviceInfo(ctx->device, CL_DEVICE_MAX_COMPUTE_UNITS, + sizeof(cl_uint), &ctx->num_cores, NULL)) { printf("Failed to get Device info (num_cores)!\n"); exit(0); } // Get Device Info (max_memory) - if (CL_SUCCESS != clGetDeviceInfo(ctx->device, CL_DEVICE_MAX_MEM_ALLOC_SIZE, sizeof(cl_ulong), &ctx->max_memory, NULL)) { + if (CL_SUCCESS != clGetDeviceInfo(ctx->device, CL_DEVICE_MAX_MEM_ALLOC_SIZE, + sizeof(cl_ulong), &ctx->max_memory, + NULL)) { printf("Failed to get Device info (max memory)!\n"); exit(0); } // Get Device Info (num work group) - if (CL_SUCCESS != clGetDeviceInfo(ctx->device, CL_DEVICE_MAX_WORK_GROUP_SIZE, sizeof(size_t), &ctx->num_work_group, NULL)) { + if (CL_SUCCESS != + clGetDeviceInfo(ctx->device, CL_DEVICE_MAX_WORK_GROUP_SIZE, + sizeof(size_t), &ctx->num_work_group, NULL)) { ctx->num_work_group = 1; } @@ -67,13 +74,16 @@ void init_cl_program(CLContext *ctx) size_t source_size = pearl_cl_len; cl_int errno; - ctx->program = clCreateProgramWithSource(ctx->context, ctx->kernel_info.num_src, (const char **) &source_str, (const size_t *) &source_size, &errno); + ctx->program = clCreateProgramWithSource( + ctx->context, ctx->kernel_info.num_src, (const char **) &source_str, + (const size_t *) &source_size, &errno); if (CL_SUCCESS != errno) { printf("Failed to create program with source\n"); exit(0); } - errno = clBuildProgram(ctx->program, 1, &ctx->device, "-Werror", NULL, NULL); + errno = + clBuildProgram(ctx->program, 1, &ctx->device, "-Werror", NULL, NULL); if (CL_SUCCESS != errno) { printf("Failed to build program\n"); exit(0); @@ -86,7 +96,7 @@ void init_cl_kernel(CLContext *ctx, char **kernel_name) for (int i = 0; i < ctx->kernel_info.num_kernels; i++) { ctx->kernel[i] = clCreateKernel(ctx->program, kernel_name[i], &errno); - if(CL_SUCCESS != errno) { + if (CL_SUCCESS != errno) { printf("Failed to create kernel\n"); exit(0); } @@ -103,27 +113,31 @@ void init_cl_buffer(CLContext *ctx) if (ctx->kernel_info.buffer_info[i].init_flags & 2) { mem *= ctx->num_cores * ctx->num_work_group; if (mem > ctx->max_memory) { - int temp = ctx->max_memory / ctx->kernel_info.buffer_info[i].size; + int temp = + ctx->max_memory / ctx->kernel_info.buffer_info[i].size; ctx->num_cores = temp; mem = temp * ctx->kernel_info.buffer_info[i].size; } } - // Check Memory bound + // Check Memory bound max_mem += mem; if (max_mem >= ctx->max_memory) { printf("Max memory pass\n"); exit(0); } - + // Create OpenCL Buffer - ctx->buffer[i] = clCreateBuffer(ctx->context, ctx->kernel_info.buffer_info[i].flags, mem, NULL, &errno); + ctx->buffer[i] = + clCreateBuffer(ctx->context, ctx->kernel_info.buffer_info[i].flags, + mem, NULL, &errno); if (CL_SUCCESS != errno) { printf("Failed to create Buffer\n"); exit(0); } // Set Kernel Arguments for (int j = 0; j < ctx->kernel_info.num_kernels; j++) { - if (CL_SUCCESS != clSetKernelArg(ctx->kernel[j], i, sizeof(cl_mem), (void *) &ctx->buffer[i])) { + if (CL_SUCCESS != clSetKernelArg(ctx->kernel[j], i, sizeof(cl_mem), + (void *) &ctx->buffer[i])) { printf("Failed to set kernel argements\n"); exit(0); } @@ -135,7 +149,7 @@ int init_clcontext(CLContext **ctx) { *ctx = (CLContext *) malloc(sizeof(CLContext)); - if(!(*ctx)) { + if (!(*ctx)) { printf("clcontext.c: init_clcontext: unavailable malloc\n"); exit(0); } @@ -143,7 +157,7 @@ int init_clcontext(CLContext **ctx) (*ctx)->kernel_info.num_buffers = 9; (*ctx)->kernel_info.num_kernels = 3; (*ctx)->kernel_info.num_src = 1; - + init_cl_devices(*ctx); init_cl_program(*ctx); diff --git a/src/constants.h b/src/constants.h index c027009..aac78f0 100644 --- a/src/constants.h +++ b/src/constants.h @@ -10,7 +10,8 @@ #define SignatureMessageFragmentTrinaryOffset 0 #define SignatureMessageFragmentTrinarySize 6561 -#define AddressTrinaryOffset SignatureMessageFragmentTrinaryOffset + SignatureMessageFragmentTrinarySize +#define AddressTrinaryOffset \ + SignatureMessageFragmentTrinaryOffset + SignatureMessageFragmentTrinarySize #define AddressTrinarySize 243 #define ValueTrinaryOffset AddressTrinaryOffset + AddressTrinarySize #define ValueTrinarySize 81 @@ -20,27 +21,42 @@ #define TimestampTrinarySize 27 #define CurrentIndexTrinaryOffset TimestampTrinaryOffset + TimestampTrinarySize #define CurrentIndexTrinarySize 27 -#define LastIndexTrinaryOffset CurrentIndexTrinaryOffset + CurrentIndexTrinarySize +#define LastIndexTrinaryOffset \ + CurrentIndexTrinaryOffset + CurrentIndexTrinarySize #define LastIndexTrinarySize 27 #define BundleTrinaryOffset LastIndexTrinaryOffset + LastIndexTrinarySize #define BundleTrinarySize 243 #define TrunkTransactionTrinaryOffset BundleTrinaryOffset + BundleTrinarySize #define TrunkTransactionTrinarySize 243 -#define BranchTransactionTrinaryOffset TrunkTransactionTrinaryOffset + TrunkTransactionTrinarySize +#define BranchTransactionTrinaryOffset \ + TrunkTransactionTrinaryOffset + TrunkTransactionTrinarySize #define BranchTransactionTrinarySize 243 -#define TagTrinaryOffset BranchTransactionTrinaryOffset + BranchTransactionTrinarySize +#define TagTrinaryOffset \ + BranchTransactionTrinaryOffset + BranchTransactionTrinarySize #define TagTrinarySize 81 #define AttachmentTimestampTrinaryOffset TagTrinaryOffset + TagTrinarySize #define AttachmentTimestampTrinarySize 27 -#define AttachmentTimestampLowerBoundTrinaryOffset AttachmentTimestampTrinaryOffset + AttachmentTimestampTrinarySize +#define AttachmentTimestampLowerBoundTrinaryOffset \ + AttachmentTimestampTrinaryOffset + AttachmentTimestampTrinarySize #define AttachmentTimestampLowerBoundTrinarySize 27 -#define AttachmentTimestampUpperBoundTrinaryOffset AttachmentTimestampLowerBoundTrinaryOffset + AttachmentTimestampLowerBoundTrinarySize +#define AttachmentTimestampUpperBoundTrinaryOffset \ + AttachmentTimestampLowerBoundTrinaryOffset + \ + AttachmentTimestampLowerBoundTrinarySize #define AttachmentTimestampUpperBoundTrinarySize 27 -#define NonceTrinaryOffset AttachmentTimestampUpperBoundTrinaryOffset + AttachmentTimestampUpperBoundTrinarySize +#define NonceTrinaryOffset \ + AttachmentTimestampUpperBoundTrinaryOffset + \ + AttachmentTimestampUpperBoundTrinarySize #define NonceTrinarySize 81 -#define transactionTrinarySize SignatureMessageFragmentTrinarySize + AddressTrinarySize + ValueTrinarySize + ObsoleteTagTrinarySize + TimestampTrinarySize + CurrentIndexTrinarySize + LastIndexTrinarySize + BundleTrinarySize + TrunkTransactionTrinarySize + BranchTransactionTrinarySize + TagTrinarySize + AttachmentTimestampTrinarySize + AttachmentTimestampLowerBoundTrinarySize + AttachmentTimestampUpperBoundTrinarySize + NonceTrinarySize +#define transactionTrinarySize \ + SignatureMessageFragmentTrinarySize + AddressTrinarySize + \ + ValueTrinarySize + ObsoleteTagTrinarySize + TimestampTrinarySize + \ + CurrentIndexTrinarySize + LastIndexTrinarySize + BundleTrinarySize + \ + TrunkTransactionTrinarySize + BranchTransactionTrinarySize + \ + TagTrinarySize + AttachmentTimestampTrinarySize + \ + AttachmentTimestampLowerBoundTrinarySize + \ + AttachmentTimestampUpperBoundTrinarySize + NonceTrinarySize extern char TryteAlphabet[]; diff --git a/src/dcurl.c b/src/dcurl.c index 470a980..a00b39e 100644 --- a/src/dcurl.c +++ b/src/dcurl.c @@ -1,12 +1,12 @@ -#include -#include +#include "dcurl.h" #include #include +#include +#include #include -#include "dcurl.h" -#include "trinary/trinary.h" -#include "pow_sse.h" #include "pow_cl.h" +#include "pow_sse.h" +#include "trinary/trinary.h" /* number of task that CPU can execute concurrently */ @@ -97,7 +97,8 @@ Trytes_t *dcurl_entry(Trytes_t *trytes, int mwm) /* get mutex number */ pthread_mutex_lock(&mtx); selected_entry = 1; - /* get mutex number. If return value is -1, which means cpu queue full */ + /* get mutex number. If return value is -1, which means cpu queue full + */ if ((selected_mutex_id = get_mutex_id(cpu_mutex_id, 1)) == -1) { selected_mutex_id = get_mutex_id(gpu_mutex_id, 2); selected_entry = 2; @@ -106,28 +107,28 @@ Trytes_t *dcurl_entry(Trytes_t *trytes, int mwm) } Trytes_t *ret_trytes = NULL; - + switch (selected_entry) { - case 1: - ret_trytes = PowSSE(trytes, mwm, selected_mutex_id); - break; + case 1: + ret_trytes = PowSSE(trytes, mwm, selected_mutex_id); + break; #if defined(ENABLE_OPENCL) - case 2: - ret_trytes = PowCL(trytes, mwm, selected_mutex_id); - break; + case 2: + ret_trytes = PowCL(trytes, mwm, selected_mutex_id); + break; #endif - default: - printf("error produced\n"); - exit(0); + default: + printf("error produced\n"); + exit(0); } - + pthread_mutex_lock(&mtx); - + if (selected_entry == 1) cpu_mutex_id[selected_mutex_id] = 0; else gpu_mutex_id[selected_mutex_id] = 0; - + if (num_waiting_thread > 0) { sem_post(¬ify); num_waiting_thread--; @@ -141,5 +142,3 @@ Trytes_t *dcurl_entry(Trytes_t *trytes, int mwm) return ret_trytes; } - - diff --git a/src/hash/curl.c b/src/hash/curl.c index fdcee01..fcf442f 100644 --- a/src/hash/curl.c +++ b/src/hash/curl.c @@ -1,48 +1,98 @@ +#include "curl.h" #include #include -#include "curl.h" static const char truthTable[11] = {1, 0, -1, 2, 1, -1, 0, 2, -1, 1, 0}; -static const int indices__[] = {0, 364, 728, 363, 727, 362, 726, 361, 725, 360, 724, 359, 723, 358, 722, 357, 721, 356, 720, 355, 719, 354, 718, 353, 717, 352, 716, 351, 715, 350, 714, 349, 713, 348, 712, 347, 711, 346, 710, 345, 709, 344, 708, 343, 707, 342, 706, 341, 705, 340, 704, 339, 703, 338, 702, 337, 701, 336, 700, 335, 699, 334, 698, 333, 697, 332, 696, 331, 695, 330, 694, 329, 693, 328, 692, 327, 691, 326, 690, 325, 689, 324, 688, 323, 687, 322, 686, 321, 685, 320, 684, 319, 683, 318, 682, 317, 681, 316, 680, 315, 679, 314, 678, 313, 677, 312, 676, 311, 675, 310, 674, 309, 673, 308, 672, 307, 671, 306, 670, 305, 669, 304, 668, 303, 667, 302, 666, 301, 665, 300, 664, 299, 663, 298, 662, 297, 661, 296, 660, 295, 659, 294, 658, 293, 657, 292, 656, 291, 655, 290, 654, 289, 653, 288, 652, 287, 651, 286, 650, 285, 649, 284, 648, 283, 647, 282, 646, 281, 645, 280, 644, 279, 643, 278, 642, 277, 641, 276, 640, 275, 639, 274, 638, 273, 637, 272, 636, 271, 635, 270, 634, 269, 633, 268, 632, 267, 631, 266, 630, 265, 629, 264, 628, 263, 627, 262, 626, 261, 625, 260, 624, 259, 623, 258, 622, 257, 621, 256, 620, 255, 619, 254, 618, 253, 617, 252, 616, 251, 615, 250, 614, 249, 613, 248, 612, 247, 611, 246, 610, 245, 609, 244, 608, 243, 607, 242, 606, 241, 605, 240, 604, 239, 603, 238, 602, 237, 601, 236, 600, 235, 599, 234, 598, 233, 597, 232, 596, 231, 595, 230, 594, 229, 593, 228, 592, 227, 591, 226, 590, 225, 589, 224, 588, 223, 587, 222, 586, 221, 585, 220, 584, 219, 583, 218, 582, 217, 581, 216, 580, 215, 579, 214, 578, 213, 577, 212, 576, 211, 575, 210, 574, 209, 573, 208, 572, 207, 571, 206, 570, 205, 569, 204, 568, 203, 567, 202, 566, 201, 565, 200, 564, 199, 563, 198, 562, 197, 561, 196, 560, 195, 559, 194, 558, 193, 557, 192, 556, 191, 555, 190, 554, 189, 553, 188, 552, 187, 551, 186, 550, 185, 549, 184, 548, 183, 547, 182, 546, 181, 545, 180, 544, 179, 543, 178, 542, 177, 541, 176, 540, 175, 539, 174, 538, 173, 537, 172, 536, 171, 535, 170, 534, 169, 533, 168, 532, 167, 531, 166, 530, 165, 529, 164, 528, 163, 527, 162, 526, 161, 525, 160, 524, 159, 523, 158, 522, 157, 521, 156, 520, 155, 519, 154, 518, 153, 517, 152, 516, 151, 515, 150, 514, 149, 513, 148, 512, 147, 511, 146, 510, 145, 509, 144, 508, 143, 507, 142, 506, 141, 505, 140, 504, 139, 503, 138, 502, 137, 501, 136, 500, 135, 499, 134, 498, 133, 497, 132, 496, 131, 495, 130, 494, 129, 493, 128, 492, 127, 491, 126, 490, 125, 489, 124, 488, 123, 487, 122, 486, 121, 485, 120, 484, 119, 483, 118, 482, 117, 481, 116, 480, 115, 479, 114, 478, 113, 477, 112, 476, 111, 475, 110, 474, 109, 473, 108, 472, 107, 471, 106, 470, 105, 469, 104, 468, 103, 467, 102, 466, 101, 465, 100, 464, 99, 463, 98, 462, 97, 461, 96, 460, 95, 459, 94, 458, 93, 457, 92, 456, 91, 455, 90, 454, 89, 453, 88, 452, 87, 451, 86, 450, 85, 449, 84, 448, 83, 447, 82, 446, 81, 445, 80, 444, 79, 443, 78, 442, 77, 441, 76, 440, 75, 439, 74, 438, 73, 437, 72, 436, 71, 435, 70, 434, 69, 433, 68, 432, 67, 431, 66, 430, 65, 429, 64, 428, 63, 427, 62, 426, 61, 425, 60, 424, 59, 423, 58, 422, 57, 421, 56, 420, 55, 419, 54, 418, 53, 417, 52, 416, 51, 415, 50, 414, 49, 413, 48, 412, 47, 411, 46, 410, 45, 409, 44, 408, 43, 407, 42, 406, 41, 405, 40, 404, 39, 403, 38, 402, 37, 401, 36, 400, 35, 399, 34, 398, 33, 397, 32, 396, 31, 395, 30, 394, 29, 393, 28, 392, 27, 391, 26, 390, 25, 389, 24, 388, 23, 387, 22, 386, 21, 385, 20, 384, 19, 383, 18, 382, 17, 381, 16, 380, 15, 379, 14, 378, 13, 377, 12, 376, 11, 375, 10, 374, 9, 373, 8, 372, 7, 371, 6, 370, 5, 369, 4, 368, 3, 367, 2, 366, 1, 365, 0}; +static const int indices__[] = { + 0, 364, 728, 363, 727, 362, 726, 361, 725, 360, 724, 359, 723, 358, 722, + 357, 721, 356, 720, 355, 719, 354, 718, 353, 717, 352, 716, 351, 715, 350, + 714, 349, 713, 348, 712, 347, 711, 346, 710, 345, 709, 344, 708, 343, 707, + 342, 706, 341, 705, 340, 704, 339, 703, 338, 702, 337, 701, 336, 700, 335, + 699, 334, 698, 333, 697, 332, 696, 331, 695, 330, 694, 329, 693, 328, 692, + 327, 691, 326, 690, 325, 689, 324, 688, 323, 687, 322, 686, 321, 685, 320, + 684, 319, 683, 318, 682, 317, 681, 316, 680, 315, 679, 314, 678, 313, 677, + 312, 676, 311, 675, 310, 674, 309, 673, 308, 672, 307, 671, 306, 670, 305, + 669, 304, 668, 303, 667, 302, 666, 301, 665, 300, 664, 299, 663, 298, 662, + 297, 661, 296, 660, 295, 659, 294, 658, 293, 657, 292, 656, 291, 655, 290, + 654, 289, 653, 288, 652, 287, 651, 286, 650, 285, 649, 284, 648, 283, 647, + 282, 646, 281, 645, 280, 644, 279, 643, 278, 642, 277, 641, 276, 640, 275, + 639, 274, 638, 273, 637, 272, 636, 271, 635, 270, 634, 269, 633, 268, 632, + 267, 631, 266, 630, 265, 629, 264, 628, 263, 627, 262, 626, 261, 625, 260, + 624, 259, 623, 258, 622, 257, 621, 256, 620, 255, 619, 254, 618, 253, 617, + 252, 616, 251, 615, 250, 614, 249, 613, 248, 612, 247, 611, 246, 610, 245, + 609, 244, 608, 243, 607, 242, 606, 241, 605, 240, 604, 239, 603, 238, 602, + 237, 601, 236, 600, 235, 599, 234, 598, 233, 597, 232, 596, 231, 595, 230, + 594, 229, 593, 228, 592, 227, 591, 226, 590, 225, 589, 224, 588, 223, 587, + 222, 586, 221, 585, 220, 584, 219, 583, 218, 582, 217, 581, 216, 580, 215, + 579, 214, 578, 213, 577, 212, 576, 211, 575, 210, 574, 209, 573, 208, 572, + 207, 571, 206, 570, 205, 569, 204, 568, 203, 567, 202, 566, 201, 565, 200, + 564, 199, 563, 198, 562, 197, 561, 196, 560, 195, 559, 194, 558, 193, 557, + 192, 556, 191, 555, 190, 554, 189, 553, 188, 552, 187, 551, 186, 550, 185, + 549, 184, 548, 183, 547, 182, 546, 181, 545, 180, 544, 179, 543, 178, 542, + 177, 541, 176, 540, 175, 539, 174, 538, 173, 537, 172, 536, 171, 535, 170, + 534, 169, 533, 168, 532, 167, 531, 166, 530, 165, 529, 164, 528, 163, 527, + 162, 526, 161, 525, 160, 524, 159, 523, 158, 522, 157, 521, 156, 520, 155, + 519, 154, 518, 153, 517, 152, 516, 151, 515, 150, 514, 149, 513, 148, 512, + 147, 511, 146, 510, 145, 509, 144, 508, 143, 507, 142, 506, 141, 505, 140, + 504, 139, 503, 138, 502, 137, 501, 136, 500, 135, 499, 134, 498, 133, 497, + 132, 496, 131, 495, 130, 494, 129, 493, 128, 492, 127, 491, 126, 490, 125, + 489, 124, 488, 123, 487, 122, 486, 121, 485, 120, 484, 119, 483, 118, 482, + 117, 481, 116, 480, 115, 479, 114, 478, 113, 477, 112, 476, 111, 475, 110, + 474, 109, 473, 108, 472, 107, 471, 106, 470, 105, 469, 104, 468, 103, 467, + 102, 466, 101, 465, 100, 464, 99, 463, 98, 462, 97, 461, 96, 460, 95, + 459, 94, 458, 93, 457, 92, 456, 91, 455, 90, 454, 89, 453, 88, 452, + 87, 451, 86, 450, 85, 449, 84, 448, 83, 447, 82, 446, 81, 445, 80, + 444, 79, 443, 78, 442, 77, 441, 76, 440, 75, 439, 74, 438, 73, 437, + 72, 436, 71, 435, 70, 434, 69, 433, 68, 432, 67, 431, 66, 430, 65, + 429, 64, 428, 63, 427, 62, 426, 61, 425, 60, 424, 59, 423, 58, 422, + 57, 421, 56, 420, 55, 419, 54, 418, 53, 417, 52, 416, 51, 415, 50, + 414, 49, 413, 48, 412, 47, 411, 46, 410, 45, 409, 44, 408, 43, 407, + 42, 406, 41, 405, 40, 404, 39, 403, 38, 402, 37, 401, 36, 400, 35, + 399, 34, 398, 33, 397, 32, 396, 31, 395, 30, 394, 29, 393, 28, 392, + 27, 391, 26, 390, 25, 389, 24, 388, 23, 387, 22, 386, 21, 385, 20, + 384, 19, 383, 18, 382, 17, 381, 16, 380, 15, 379, 14, 378, 13, 377, + 12, 376, 11, 375, 10, 374, 9, 373, 8, 372, 7, 371, 6, 370, 5, + 369, 4, 368, 3, 367, 2, 366, 1, 365, 0}; static void _transform(signed char state[]) { - int r = 0, i = 0; - signed char copy[STATE_LENGTH] = {0}; - signed char *from = state, *to = copy; - for (r = 0; r < 81; r++) { - for (i = 0; i < STATE_LENGTH; i++) { - int aa = indices__[i]; - int bb = indices__[i + 1]; - to[i] = truthTable[from[aa] + (from[bb] << 2) + 5]; - } - signed char *tmp = from; - from = to; - to = tmp; - } - memcpy(state, copy, STATE_LENGTH); + int r = 0, i = 0; + signed char copy[STATE_LENGTH] = {0}; + signed char *from = state, *to = copy; + for (r = 0; r < 81; r++) { + for (i = 0; i < STATE_LENGTH; i++) { + int aa = indices__[i]; + int bb = indices__[i + 1]; + to[i] = truthTable[from[aa] + (from[bb] << 2) + 5]; + } + signed char *tmp = from; + from = to; + to = tmp; + } + memcpy(state, copy, STATE_LENGTH); } void Transform(Curl *c) { - _transform(c->state->data); + _transform(c->state->data); } void Absorb(Curl *c, Trytes_t *inn) { - Trits_t *in = trits_from_trytes(inn); - int lenn = 0; - - for (int i = 0; i < in->len; i += lenn) { - lenn = 243; - if (in->len - i < 243) lenn = in->len - i; - - /* Copy in[i, i + lenn] to c->state->data[0, lenn] */ - memcpy(c->state->data, in->data + i, lenn); - - Transform(c); - } - freeTrobject(in); + Trits_t *in = trits_from_trytes(inn); + int lenn = 0; + + for (int i = 0; i < in->len; i += lenn) { + lenn = 243; + if (in->len - i < 243) + lenn = in->len - i; + + /* Copy in[i, i + lenn] to c->state->data[0, lenn] */ + memcpy(c->state->data, in->data + i, lenn); + + Transform(c); + } + freeTrobject(in); } Trytes_t *Squeeze(Curl *c) @@ -76,7 +126,7 @@ Curl *initCurl() } void freeCurl(Curl *c) -{ +{ if (c) { freeTrobject(c->state); free(c); diff --git a/src/pearl.cl.h b/src/pearl.cl.h index 333d142..488bc45 100644 --- a/src/pearl.cl.h +++ b/src/pearl.cl.h @@ -1,963 +1,962 @@ unsigned char pearl_cl[] = { - 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x48, 0x41, 0x53, 0x48, - 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, 0x32, 0x34, 0x33, 0x0a, - 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x4f, 0x46, 0x46, 0x53, - 0x45, 0x54, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, 0x34, 0x0a, - 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x4e, 0x4f, 0x4e, 0x43, - 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, 0x48, 0x41, 0x53, - 0x48, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, 0x2f, 0x20, 0x33, - 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x49, 0x4e, 0x54, - 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, 0x4e, 0x4f, 0x4e, 0x43, - 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, 0x2f, 0x20, 0x33, - 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x4e, 0x4f, 0x4e, - 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x20, 0x48, 0x41, 0x53, - 0x48, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, 0x2d, 0x20, 0x4e, - 0x4f, 0x4e, 0x43, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x0a, - 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x4e, 0x4f, 0x4e, 0x43, - 0x45, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, - 0x20, 0x4e, 0x4f, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, - 0x20, 0x2b, 0x20, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x5f, 0x4c, 0x45, - 0x4e, 0x47, 0x54, 0x48, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, - 0x20, 0x4e, 0x4f, 0x4e, 0x43, 0x45, 0x5f, 0x49, 0x4e, 0x43, 0x52, 0x45, - 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x20, 0x4e, - 0x4f, 0x4e, 0x43, 0x45, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x5f, 0x53, 0x54, - 0x41, 0x52, 0x54, 0x20, 0x2b, 0x20, 0x49, 0x4e, 0x54, 0x5f, 0x4c, 0x45, - 0x4e, 0x47, 0x54, 0x48, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, - 0x20, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x5f, 0x4f, 0x46, 0x5f, 0x52, - 0x4f, 0x55, 0x4e, 0x44, 0x53, 0x20, 0x38, 0x31, 0x0a, 0x23, 0x64, 0x65, - 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x4c, - 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, 0x33, 0x20, 0x2a, 0x20, 0x48, 0x41, - 0x53, 0x48, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x0a, 0x23, 0x64, - 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x4c, - 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, 0x33, 0x36, 0x34, 0x0a, 0x23, 0x64, - 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x48, 0x49, 0x47, 0x48, 0x5f, 0x42, - 0x49, 0x54, 0x53, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, - 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x23, - 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x4c, 0x4f, 0x57, 0x5f, 0x42, - 0x49, 0x54, 0x53, 0x20, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x2f, - 0x2f, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x48, 0x49, 0x47, - 0x48, 0x5f, 0x42, 0x49, 0x54, 0x53, 0x0a, 0x2f, 0x2f, 0x30, 0x62, 0x31, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, - 0x31, 0x31, 0x31, 0x4c, 0x0a, 0x2f, 0x2f, 0x23, 0x64, 0x65, 0x66, 0x69, - 0x6e, 0x65, 0x20, 0x4c, 0x4f, 0x57, 0x5f, 0x42, 0x49, 0x54, 0x53, 0x0a, - 0x2f, 0x2f, 0x30, 0x62, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x4c, 0x0a, 0x2f, 0x2a, - 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x74, 0x31, 0x20, 0x3d, 0x20, 0x6a, 0x20, - 0x3d, 0x3d, 0x20, 0x30, 0x3f, 0x20, 0x30, 0x3a, 0x28, 0x28, 0x28, 0x6a, - 0x20, 0x2d, 0x20, 0x31, 0x29, 0x25, 0x32, 0x29, 0x2b, 0x31, 0x29, 0x2a, - 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, - 0x2d, 0x20, 0x28, 0x28, 0x6a, 0x2d, 0x31, 0x29, 0x3e, 0x3e, 0x31, 0x29, - 0x3b, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x5f, 0x5f, 0x63, 0x6f, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, - 0x49, 0x4e, 0x44, 0x45, 0x58, 0x5b, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, - 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, 0x2b, 0x20, 0x31, 0x5d, 0x20, - 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x30, 0x2c, 0x20, 0x20, - 0x20, 0x33, 0x36, 0x34, 0x2c, 0x20, 0x37, 0x32, 0x38, 0x2c, 0x20, 0x33, - 0x36, 0x33, 0x2c, 0x20, 0x37, 0x32, 0x37, 0x2c, 0x20, 0x33, 0x36, 0x32, - 0x2c, 0x20, 0x37, 0x32, 0x36, 0x2c, 0x20, 0x33, 0x36, 0x31, 0x2c, 0x20, - 0x37, 0x32, 0x35, 0x2c, 0x20, 0x33, 0x36, 0x30, 0x2c, 0x20, 0x37, 0x32, - 0x34, 0x2c, 0x20, 0x33, 0x35, 0x39, 0x2c, 0x20, 0x37, 0x32, 0x33, 0x2c, - 0x20, 0x33, 0x35, 0x38, 0x2c, 0x20, 0x37, 0x32, 0x32, 0x2c, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x33, 0x35, 0x37, 0x2c, 0x20, 0x37, 0x32, 0x31, 0x2c, - 0x20, 0x33, 0x35, 0x36, 0x2c, 0x20, 0x37, 0x32, 0x30, 0x2c, 0x20, 0x33, - 0x35, 0x35, 0x2c, 0x20, 0x37, 0x31, 0x39, 0x2c, 0x20, 0x33, 0x35, 0x34, - 0x2c, 0x20, 0x37, 0x31, 0x38, 0x2c, 0x20, 0x33, 0x35, 0x33, 0x2c, 0x20, - 0x37, 0x31, 0x37, 0x2c, 0x20, 0x33, 0x35, 0x32, 0x2c, 0x20, 0x37, 0x31, - 0x36, 0x2c, 0x20, 0x33, 0x35, 0x31, 0x2c, 0x20, 0x37, 0x31, 0x35, 0x2c, - 0x20, 0x33, 0x35, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x37, 0x31, - 0x34, 0x2c, 0x20, 0x33, 0x34, 0x39, 0x2c, 0x20, 0x37, 0x31, 0x33, 0x2c, - 0x20, 0x33, 0x34, 0x38, 0x2c, 0x20, 0x37, 0x31, 0x32, 0x2c, 0x20, 0x33, - 0x34, 0x37, 0x2c, 0x20, 0x37, 0x31, 0x31, 0x2c, 0x20, 0x33, 0x34, 0x36, - 0x2c, 0x20, 0x37, 0x31, 0x30, 0x2c, 0x20, 0x33, 0x34, 0x35, 0x2c, 0x20, - 0x37, 0x30, 0x39, 0x2c, 0x20, 0x33, 0x34, 0x34, 0x2c, 0x20, 0x37, 0x30, - 0x38, 0x2c, 0x20, 0x33, 0x34, 0x33, 0x2c, 0x20, 0x37, 0x30, 0x37, 0x2c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x33, 0x34, 0x32, 0x2c, 0x20, 0x37, 0x30, - 0x36, 0x2c, 0x20, 0x33, 0x34, 0x31, 0x2c, 0x20, 0x37, 0x30, 0x35, 0x2c, - 0x20, 0x33, 0x34, 0x30, 0x2c, 0x20, 0x37, 0x30, 0x34, 0x2c, 0x20, 0x33, - 0x33, 0x39, 0x2c, 0x20, 0x37, 0x30, 0x33, 0x2c, 0x20, 0x33, 0x33, 0x38, - 0x2c, 0x20, 0x37, 0x30, 0x32, 0x2c, 0x20, 0x33, 0x33, 0x37, 0x2c, 0x20, - 0x37, 0x30, 0x31, 0x2c, 0x20, 0x33, 0x33, 0x36, 0x2c, 0x20, 0x37, 0x30, - 0x30, 0x2c, 0x20, 0x33, 0x33, 0x35, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x36, 0x39, 0x39, 0x2c, 0x20, 0x33, 0x33, 0x34, 0x2c, 0x20, 0x36, 0x39, - 0x38, 0x2c, 0x20, 0x33, 0x33, 0x33, 0x2c, 0x20, 0x36, 0x39, 0x37, 0x2c, - 0x20, 0x33, 0x33, 0x32, 0x2c, 0x20, 0x36, 0x39, 0x36, 0x2c, 0x20, 0x33, - 0x33, 0x31, 0x2c, 0x20, 0x36, 0x39, 0x35, 0x2c, 0x20, 0x33, 0x33, 0x30, - 0x2c, 0x20, 0x36, 0x39, 0x34, 0x2c, 0x20, 0x33, 0x32, 0x39, 0x2c, 0x20, - 0x36, 0x39, 0x33, 0x2c, 0x20, 0x33, 0x32, 0x38, 0x2c, 0x20, 0x36, 0x39, - 0x32, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x33, 0x32, 0x37, 0x2c, 0x20, - 0x36, 0x39, 0x31, 0x2c, 0x20, 0x33, 0x32, 0x36, 0x2c, 0x20, 0x36, 0x39, - 0x30, 0x2c, 0x20, 0x33, 0x32, 0x35, 0x2c, 0x20, 0x36, 0x38, 0x39, 0x2c, - 0x20, 0x33, 0x32, 0x34, 0x2c, 0x20, 0x36, 0x38, 0x38, 0x2c, 0x20, 0x33, - 0x32, 0x33, 0x2c, 0x20, 0x36, 0x38, 0x37, 0x2c, 0x20, 0x33, 0x32, 0x32, - 0x2c, 0x20, 0x36, 0x38, 0x36, 0x2c, 0x20, 0x33, 0x32, 0x31, 0x2c, 0x20, - 0x36, 0x38, 0x35, 0x2c, 0x20, 0x33, 0x32, 0x30, 0x2c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x36, 0x38, 0x34, 0x2c, 0x20, 0x33, 0x31, 0x39, 0x2c, 0x20, - 0x36, 0x38, 0x33, 0x2c, 0x20, 0x33, 0x31, 0x38, 0x2c, 0x20, 0x36, 0x38, - 0x32, 0x2c, 0x20, 0x33, 0x31, 0x37, 0x2c, 0x20, 0x36, 0x38, 0x31, 0x2c, - 0x20, 0x33, 0x31, 0x36, 0x2c, 0x20, 0x36, 0x38, 0x30, 0x2c, 0x20, 0x33, - 0x31, 0x35, 0x2c, 0x20, 0x36, 0x37, 0x39, 0x2c, 0x20, 0x33, 0x31, 0x34, - 0x2c, 0x20, 0x36, 0x37, 0x38, 0x2c, 0x20, 0x33, 0x31, 0x33, 0x2c, 0x20, - 0x36, 0x37, 0x37, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x33, 0x31, 0x32, - 0x2c, 0x20, 0x36, 0x37, 0x36, 0x2c, 0x20, 0x33, 0x31, 0x31, 0x2c, 0x20, - 0x36, 0x37, 0x35, 0x2c, 0x20, 0x33, 0x31, 0x30, 0x2c, 0x20, 0x36, 0x37, - 0x34, 0x2c, 0x20, 0x33, 0x30, 0x39, 0x2c, 0x20, 0x36, 0x37, 0x33, 0x2c, - 0x20, 0x33, 0x30, 0x38, 0x2c, 0x20, 0x36, 0x37, 0x32, 0x2c, 0x20, 0x33, - 0x30, 0x37, 0x2c, 0x20, 0x36, 0x37, 0x31, 0x2c, 0x20, 0x33, 0x30, 0x36, - 0x2c, 0x20, 0x36, 0x37, 0x30, 0x2c, 0x20, 0x33, 0x30, 0x35, 0x2c, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x36, 0x36, 0x39, 0x2c, 0x20, 0x33, 0x30, 0x34, - 0x2c, 0x20, 0x36, 0x36, 0x38, 0x2c, 0x20, 0x33, 0x30, 0x33, 0x2c, 0x20, - 0x36, 0x36, 0x37, 0x2c, 0x20, 0x33, 0x30, 0x32, 0x2c, 0x20, 0x36, 0x36, - 0x36, 0x2c, 0x20, 0x33, 0x30, 0x31, 0x2c, 0x20, 0x36, 0x36, 0x35, 0x2c, - 0x20, 0x33, 0x30, 0x30, 0x2c, 0x20, 0x36, 0x36, 0x34, 0x2c, 0x20, 0x32, - 0x39, 0x39, 0x2c, 0x20, 0x36, 0x36, 0x33, 0x2c, 0x20, 0x32, 0x39, 0x38, - 0x2c, 0x20, 0x36, 0x36, 0x32, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x32, - 0x39, 0x37, 0x2c, 0x20, 0x36, 0x36, 0x31, 0x2c, 0x20, 0x32, 0x39, 0x36, - 0x2c, 0x20, 0x36, 0x36, 0x30, 0x2c, 0x20, 0x32, 0x39, 0x35, 0x2c, 0x20, - 0x36, 0x35, 0x39, 0x2c, 0x20, 0x32, 0x39, 0x34, 0x2c, 0x20, 0x36, 0x35, - 0x38, 0x2c, 0x20, 0x32, 0x39, 0x33, 0x2c, 0x20, 0x36, 0x35, 0x37, 0x2c, - 0x20, 0x32, 0x39, 0x32, 0x2c, 0x20, 0x36, 0x35, 0x36, 0x2c, 0x20, 0x32, - 0x39, 0x31, 0x2c, 0x20, 0x36, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x39, 0x30, - 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x36, 0x35, 0x34, 0x2c, 0x20, 0x32, - 0x38, 0x39, 0x2c, 0x20, 0x36, 0x35, 0x33, 0x2c, 0x20, 0x32, 0x38, 0x38, - 0x2c, 0x20, 0x36, 0x35, 0x32, 0x2c, 0x20, 0x32, 0x38, 0x37, 0x2c, 0x20, - 0x36, 0x35, 0x31, 0x2c, 0x20, 0x32, 0x38, 0x36, 0x2c, 0x20, 0x36, 0x35, - 0x30, 0x2c, 0x20, 0x32, 0x38, 0x35, 0x2c, 0x20, 0x36, 0x34, 0x39, 0x2c, - 0x20, 0x32, 0x38, 0x34, 0x2c, 0x20, 0x36, 0x34, 0x38, 0x2c, 0x20, 0x32, - 0x38, 0x33, 0x2c, 0x20, 0x36, 0x34, 0x37, 0x2c, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x32, 0x38, 0x32, 0x2c, 0x20, 0x36, 0x34, 0x36, 0x2c, 0x20, 0x32, - 0x38, 0x31, 0x2c, 0x20, 0x36, 0x34, 0x35, 0x2c, 0x20, 0x32, 0x38, 0x30, - 0x2c, 0x20, 0x36, 0x34, 0x34, 0x2c, 0x20, 0x32, 0x37, 0x39, 0x2c, 0x20, - 0x36, 0x34, 0x33, 0x2c, 0x20, 0x32, 0x37, 0x38, 0x2c, 0x20, 0x36, 0x34, - 0x32, 0x2c, 0x20, 0x32, 0x37, 0x37, 0x2c, 0x20, 0x36, 0x34, 0x31, 0x2c, - 0x20, 0x32, 0x37, 0x36, 0x2c, 0x20, 0x36, 0x34, 0x30, 0x2c, 0x20, 0x32, - 0x37, 0x35, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x36, 0x33, 0x39, 0x2c, - 0x20, 0x32, 0x37, 0x34, 0x2c, 0x20, 0x36, 0x33, 0x38, 0x2c, 0x20, 0x32, - 0x37, 0x33, 0x2c, 0x20, 0x36, 0x33, 0x37, 0x2c, 0x20, 0x32, 0x37, 0x32, - 0x2c, 0x20, 0x36, 0x33, 0x36, 0x2c, 0x20, 0x32, 0x37, 0x31, 0x2c, 0x20, - 0x36, 0x33, 0x35, 0x2c, 0x20, 0x32, 0x37, 0x30, 0x2c, 0x20, 0x36, 0x33, - 0x34, 0x2c, 0x20, 0x32, 0x36, 0x39, 0x2c, 0x20, 0x36, 0x33, 0x33, 0x2c, - 0x20, 0x32, 0x36, 0x38, 0x2c, 0x20, 0x36, 0x33, 0x32, 0x2c, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x32, 0x36, 0x37, 0x2c, 0x20, 0x36, 0x33, 0x31, 0x2c, - 0x20, 0x32, 0x36, 0x36, 0x2c, 0x20, 0x36, 0x33, 0x30, 0x2c, 0x20, 0x32, - 0x36, 0x35, 0x2c, 0x20, 0x36, 0x32, 0x39, 0x2c, 0x20, 0x32, 0x36, 0x34, - 0x2c, 0x20, 0x36, 0x32, 0x38, 0x2c, 0x20, 0x32, 0x36, 0x33, 0x2c, 0x20, - 0x36, 0x32, 0x37, 0x2c, 0x20, 0x32, 0x36, 0x32, 0x2c, 0x20, 0x36, 0x32, - 0x36, 0x2c, 0x20, 0x32, 0x36, 0x31, 0x2c, 0x20, 0x36, 0x32, 0x35, 0x2c, - 0x20, 0x32, 0x36, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x36, 0x32, - 0x34, 0x2c, 0x20, 0x32, 0x35, 0x39, 0x2c, 0x20, 0x36, 0x32, 0x33, 0x2c, - 0x20, 0x32, 0x35, 0x38, 0x2c, 0x20, 0x36, 0x32, 0x32, 0x2c, 0x20, 0x32, - 0x35, 0x37, 0x2c, 0x20, 0x36, 0x32, 0x31, 0x2c, 0x20, 0x32, 0x35, 0x36, - 0x2c, 0x20, 0x36, 0x32, 0x30, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, - 0x36, 0x31, 0x39, 0x2c, 0x20, 0x32, 0x35, 0x34, 0x2c, 0x20, 0x36, 0x31, - 0x38, 0x2c, 0x20, 0x32, 0x35, 0x33, 0x2c, 0x20, 0x36, 0x31, 0x37, 0x2c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x32, 0x35, 0x32, 0x2c, 0x20, 0x36, 0x31, - 0x36, 0x2c, 0x20, 0x32, 0x35, 0x31, 0x2c, 0x20, 0x36, 0x31, 0x35, 0x2c, - 0x20, 0x32, 0x35, 0x30, 0x2c, 0x20, 0x36, 0x31, 0x34, 0x2c, 0x20, 0x32, - 0x34, 0x39, 0x2c, 0x20, 0x36, 0x31, 0x33, 0x2c, 0x20, 0x32, 0x34, 0x38, - 0x2c, 0x20, 0x36, 0x31, 0x32, 0x2c, 0x20, 0x32, 0x34, 0x37, 0x2c, 0x20, - 0x36, 0x31, 0x31, 0x2c, 0x20, 0x32, 0x34, 0x36, 0x2c, 0x20, 0x36, 0x31, - 0x30, 0x2c, 0x20, 0x32, 0x34, 0x35, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x36, 0x30, 0x39, 0x2c, 0x20, 0x32, 0x34, 0x34, 0x2c, 0x20, 0x36, 0x30, - 0x38, 0x2c, 0x20, 0x32, 0x34, 0x33, 0x2c, 0x20, 0x36, 0x30, 0x37, 0x2c, - 0x20, 0x32, 0x34, 0x32, 0x2c, 0x20, 0x36, 0x30, 0x36, 0x2c, 0x20, 0x32, - 0x34, 0x31, 0x2c, 0x20, 0x36, 0x30, 0x35, 0x2c, 0x20, 0x32, 0x34, 0x30, - 0x2c, 0x20, 0x36, 0x30, 0x34, 0x2c, 0x20, 0x32, 0x33, 0x39, 0x2c, 0x20, - 0x36, 0x30, 0x33, 0x2c, 0x20, 0x32, 0x33, 0x38, 0x2c, 0x20, 0x36, 0x30, - 0x32, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x32, 0x33, 0x37, 0x2c, 0x20, - 0x36, 0x30, 0x31, 0x2c, 0x20, 0x32, 0x33, 0x36, 0x2c, 0x20, 0x36, 0x30, - 0x30, 0x2c, 0x20, 0x32, 0x33, 0x35, 0x2c, 0x20, 0x35, 0x39, 0x39, 0x2c, - 0x20, 0x32, 0x33, 0x34, 0x2c, 0x20, 0x35, 0x39, 0x38, 0x2c, 0x20, 0x32, - 0x33, 0x33, 0x2c, 0x20, 0x35, 0x39, 0x37, 0x2c, 0x20, 0x32, 0x33, 0x32, - 0x2c, 0x20, 0x35, 0x39, 0x36, 0x2c, 0x20, 0x32, 0x33, 0x31, 0x2c, 0x20, - 0x35, 0x39, 0x35, 0x2c, 0x20, 0x32, 0x33, 0x30, 0x2c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x35, 0x39, 0x34, 0x2c, 0x20, 0x32, 0x32, 0x39, 0x2c, 0x20, - 0x35, 0x39, 0x33, 0x2c, 0x20, 0x32, 0x32, 0x38, 0x2c, 0x20, 0x35, 0x39, - 0x32, 0x2c, 0x20, 0x32, 0x32, 0x37, 0x2c, 0x20, 0x35, 0x39, 0x31, 0x2c, - 0x20, 0x32, 0x32, 0x36, 0x2c, 0x20, 0x35, 0x39, 0x30, 0x2c, 0x20, 0x32, - 0x32, 0x35, 0x2c, 0x20, 0x35, 0x38, 0x39, 0x2c, 0x20, 0x32, 0x32, 0x34, - 0x2c, 0x20, 0x35, 0x38, 0x38, 0x2c, 0x20, 0x32, 0x32, 0x33, 0x2c, 0x20, - 0x35, 0x38, 0x37, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x32, 0x32, 0x32, - 0x2c, 0x20, 0x35, 0x38, 0x36, 0x2c, 0x20, 0x32, 0x32, 0x31, 0x2c, 0x20, - 0x35, 0x38, 0x35, 0x2c, 0x20, 0x32, 0x32, 0x30, 0x2c, 0x20, 0x35, 0x38, - 0x34, 0x2c, 0x20, 0x32, 0x31, 0x39, 0x2c, 0x20, 0x35, 0x38, 0x33, 0x2c, - 0x20, 0x32, 0x31, 0x38, 0x2c, 0x20, 0x35, 0x38, 0x32, 0x2c, 0x20, 0x32, - 0x31, 0x37, 0x2c, 0x20, 0x35, 0x38, 0x31, 0x2c, 0x20, 0x32, 0x31, 0x36, - 0x2c, 0x20, 0x35, 0x38, 0x30, 0x2c, 0x20, 0x32, 0x31, 0x35, 0x2c, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x35, 0x37, 0x39, 0x2c, 0x20, 0x32, 0x31, 0x34, - 0x2c, 0x20, 0x35, 0x37, 0x38, 0x2c, 0x20, 0x32, 0x31, 0x33, 0x2c, 0x20, - 0x35, 0x37, 0x37, 0x2c, 0x20, 0x32, 0x31, 0x32, 0x2c, 0x20, 0x35, 0x37, - 0x36, 0x2c, 0x20, 0x32, 0x31, 0x31, 0x2c, 0x20, 0x35, 0x37, 0x35, 0x2c, - 0x20, 0x32, 0x31, 0x30, 0x2c, 0x20, 0x35, 0x37, 0x34, 0x2c, 0x20, 0x32, - 0x30, 0x39, 0x2c, 0x20, 0x35, 0x37, 0x33, 0x2c, 0x20, 0x32, 0x30, 0x38, - 0x2c, 0x20, 0x35, 0x37, 0x32, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x32, - 0x30, 0x37, 0x2c, 0x20, 0x35, 0x37, 0x31, 0x2c, 0x20, 0x32, 0x30, 0x36, - 0x2c, 0x20, 0x35, 0x37, 0x30, 0x2c, 0x20, 0x32, 0x30, 0x35, 0x2c, 0x20, - 0x35, 0x36, 0x39, 0x2c, 0x20, 0x32, 0x30, 0x34, 0x2c, 0x20, 0x35, 0x36, - 0x38, 0x2c, 0x20, 0x32, 0x30, 0x33, 0x2c, 0x20, 0x35, 0x36, 0x37, 0x2c, - 0x20, 0x32, 0x30, 0x32, 0x2c, 0x20, 0x35, 0x36, 0x36, 0x2c, 0x20, 0x32, - 0x30, 0x31, 0x2c, 0x20, 0x35, 0x36, 0x35, 0x2c, 0x20, 0x32, 0x30, 0x30, - 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x35, 0x36, 0x34, 0x2c, 0x20, 0x31, - 0x39, 0x39, 0x2c, 0x20, 0x35, 0x36, 0x33, 0x2c, 0x20, 0x31, 0x39, 0x38, - 0x2c, 0x20, 0x35, 0x36, 0x32, 0x2c, 0x20, 0x31, 0x39, 0x37, 0x2c, 0x20, - 0x35, 0x36, 0x31, 0x2c, 0x20, 0x31, 0x39, 0x36, 0x2c, 0x20, 0x35, 0x36, - 0x30, 0x2c, 0x20, 0x31, 0x39, 0x35, 0x2c, 0x20, 0x35, 0x35, 0x39, 0x2c, - 0x20, 0x31, 0x39, 0x34, 0x2c, 0x20, 0x35, 0x35, 0x38, 0x2c, 0x20, 0x31, - 0x39, 0x33, 0x2c, 0x20, 0x35, 0x35, 0x37, 0x2c, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x31, 0x39, 0x32, 0x2c, 0x20, 0x35, 0x35, 0x36, 0x2c, 0x20, 0x31, - 0x39, 0x31, 0x2c, 0x20, 0x35, 0x35, 0x35, 0x2c, 0x20, 0x31, 0x39, 0x30, - 0x2c, 0x20, 0x35, 0x35, 0x34, 0x2c, 0x20, 0x31, 0x38, 0x39, 0x2c, 0x20, - 0x35, 0x35, 0x33, 0x2c, 0x20, 0x31, 0x38, 0x38, 0x2c, 0x20, 0x35, 0x35, - 0x32, 0x2c, 0x20, 0x31, 0x38, 0x37, 0x2c, 0x20, 0x35, 0x35, 0x31, 0x2c, - 0x20, 0x31, 0x38, 0x36, 0x2c, 0x20, 0x35, 0x35, 0x30, 0x2c, 0x20, 0x31, - 0x38, 0x35, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x35, 0x34, 0x39, 0x2c, - 0x20, 0x31, 0x38, 0x34, 0x2c, 0x20, 0x35, 0x34, 0x38, 0x2c, 0x20, 0x31, - 0x38, 0x33, 0x2c, 0x20, 0x35, 0x34, 0x37, 0x2c, 0x20, 0x31, 0x38, 0x32, - 0x2c, 0x20, 0x35, 0x34, 0x36, 0x2c, 0x20, 0x31, 0x38, 0x31, 0x2c, 0x20, - 0x35, 0x34, 0x35, 0x2c, 0x20, 0x31, 0x38, 0x30, 0x2c, 0x20, 0x35, 0x34, - 0x34, 0x2c, 0x20, 0x31, 0x37, 0x39, 0x2c, 0x20, 0x35, 0x34, 0x33, 0x2c, - 0x20, 0x31, 0x37, 0x38, 0x2c, 0x20, 0x35, 0x34, 0x32, 0x2c, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x31, 0x37, 0x37, 0x2c, 0x20, 0x35, 0x34, 0x31, 0x2c, - 0x20, 0x31, 0x37, 0x36, 0x2c, 0x20, 0x35, 0x34, 0x30, 0x2c, 0x20, 0x31, - 0x37, 0x35, 0x2c, 0x20, 0x35, 0x33, 0x39, 0x2c, 0x20, 0x31, 0x37, 0x34, - 0x2c, 0x20, 0x35, 0x33, 0x38, 0x2c, 0x20, 0x31, 0x37, 0x33, 0x2c, 0x20, - 0x35, 0x33, 0x37, 0x2c, 0x20, 0x31, 0x37, 0x32, 0x2c, 0x20, 0x35, 0x33, - 0x36, 0x2c, 0x20, 0x31, 0x37, 0x31, 0x2c, 0x20, 0x35, 0x33, 0x35, 0x2c, - 0x20, 0x31, 0x37, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x35, 0x33, - 0x34, 0x2c, 0x20, 0x31, 0x36, 0x39, 0x2c, 0x20, 0x35, 0x33, 0x33, 0x2c, - 0x20, 0x31, 0x36, 0x38, 0x2c, 0x20, 0x35, 0x33, 0x32, 0x2c, 0x20, 0x31, - 0x36, 0x37, 0x2c, 0x20, 0x35, 0x33, 0x31, 0x2c, 0x20, 0x31, 0x36, 0x36, - 0x2c, 0x20, 0x35, 0x33, 0x30, 0x2c, 0x20, 0x31, 0x36, 0x35, 0x2c, 0x20, - 0x35, 0x32, 0x39, 0x2c, 0x20, 0x31, 0x36, 0x34, 0x2c, 0x20, 0x35, 0x32, - 0x38, 0x2c, 0x20, 0x31, 0x36, 0x33, 0x2c, 0x20, 0x35, 0x32, 0x37, 0x2c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x31, 0x36, 0x32, 0x2c, 0x20, 0x35, 0x32, - 0x36, 0x2c, 0x20, 0x31, 0x36, 0x31, 0x2c, 0x20, 0x35, 0x32, 0x35, 0x2c, - 0x20, 0x31, 0x36, 0x30, 0x2c, 0x20, 0x35, 0x32, 0x34, 0x2c, 0x20, 0x31, - 0x35, 0x39, 0x2c, 0x20, 0x35, 0x32, 0x33, 0x2c, 0x20, 0x31, 0x35, 0x38, - 0x2c, 0x20, 0x35, 0x32, 0x32, 0x2c, 0x20, 0x31, 0x35, 0x37, 0x2c, 0x20, - 0x35, 0x32, 0x31, 0x2c, 0x20, 0x31, 0x35, 0x36, 0x2c, 0x20, 0x35, 0x32, - 0x30, 0x2c, 0x20, 0x31, 0x35, 0x35, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x35, 0x31, 0x39, 0x2c, 0x20, 0x31, 0x35, 0x34, 0x2c, 0x20, 0x35, 0x31, - 0x38, 0x2c, 0x20, 0x31, 0x35, 0x33, 0x2c, 0x20, 0x35, 0x31, 0x37, 0x2c, - 0x20, 0x31, 0x35, 0x32, 0x2c, 0x20, 0x35, 0x31, 0x36, 0x2c, 0x20, 0x31, - 0x35, 0x31, 0x2c, 0x20, 0x35, 0x31, 0x35, 0x2c, 0x20, 0x31, 0x35, 0x30, - 0x2c, 0x20, 0x35, 0x31, 0x34, 0x2c, 0x20, 0x31, 0x34, 0x39, 0x2c, 0x20, - 0x35, 0x31, 0x33, 0x2c, 0x20, 0x31, 0x34, 0x38, 0x2c, 0x20, 0x35, 0x31, - 0x32, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x31, 0x34, 0x37, 0x2c, 0x20, - 0x35, 0x31, 0x31, 0x2c, 0x20, 0x31, 0x34, 0x36, 0x2c, 0x20, 0x35, 0x31, - 0x30, 0x2c, 0x20, 0x31, 0x34, 0x35, 0x2c, 0x20, 0x35, 0x30, 0x39, 0x2c, - 0x20, 0x31, 0x34, 0x34, 0x2c, 0x20, 0x35, 0x30, 0x38, 0x2c, 0x20, 0x31, - 0x34, 0x33, 0x2c, 0x20, 0x35, 0x30, 0x37, 0x2c, 0x20, 0x31, 0x34, 0x32, - 0x2c, 0x20, 0x35, 0x30, 0x36, 0x2c, 0x20, 0x31, 0x34, 0x31, 0x2c, 0x20, - 0x35, 0x30, 0x35, 0x2c, 0x20, 0x31, 0x34, 0x30, 0x2c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x35, 0x30, 0x34, 0x2c, 0x20, 0x31, 0x33, 0x39, 0x2c, 0x20, - 0x35, 0x30, 0x33, 0x2c, 0x20, 0x31, 0x33, 0x38, 0x2c, 0x20, 0x35, 0x30, - 0x32, 0x2c, 0x20, 0x31, 0x33, 0x37, 0x2c, 0x20, 0x35, 0x30, 0x31, 0x2c, - 0x20, 0x31, 0x33, 0x36, 0x2c, 0x20, 0x35, 0x30, 0x30, 0x2c, 0x20, 0x31, - 0x33, 0x35, 0x2c, 0x20, 0x34, 0x39, 0x39, 0x2c, 0x20, 0x31, 0x33, 0x34, - 0x2c, 0x20, 0x34, 0x39, 0x38, 0x2c, 0x20, 0x31, 0x33, 0x33, 0x2c, 0x20, - 0x34, 0x39, 0x37, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x31, 0x33, 0x32, - 0x2c, 0x20, 0x34, 0x39, 0x36, 0x2c, 0x20, 0x31, 0x33, 0x31, 0x2c, 0x20, - 0x34, 0x39, 0x35, 0x2c, 0x20, 0x31, 0x33, 0x30, 0x2c, 0x20, 0x34, 0x39, - 0x34, 0x2c, 0x20, 0x31, 0x32, 0x39, 0x2c, 0x20, 0x34, 0x39, 0x33, 0x2c, - 0x20, 0x31, 0x32, 0x38, 0x2c, 0x20, 0x34, 0x39, 0x32, 0x2c, 0x20, 0x31, - 0x32, 0x37, 0x2c, 0x20, 0x34, 0x39, 0x31, 0x2c, 0x20, 0x31, 0x32, 0x36, - 0x2c, 0x20, 0x34, 0x39, 0x30, 0x2c, 0x20, 0x31, 0x32, 0x35, 0x2c, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x34, 0x38, 0x39, 0x2c, 0x20, 0x31, 0x32, 0x34, - 0x2c, 0x20, 0x34, 0x38, 0x38, 0x2c, 0x20, 0x31, 0x32, 0x33, 0x2c, 0x20, - 0x34, 0x38, 0x37, 0x2c, 0x20, 0x31, 0x32, 0x32, 0x2c, 0x20, 0x34, 0x38, - 0x36, 0x2c, 0x20, 0x31, 0x32, 0x31, 0x2c, 0x20, 0x34, 0x38, 0x35, 0x2c, - 0x20, 0x31, 0x32, 0x30, 0x2c, 0x20, 0x34, 0x38, 0x34, 0x2c, 0x20, 0x31, - 0x31, 0x39, 0x2c, 0x20, 0x34, 0x38, 0x33, 0x2c, 0x20, 0x31, 0x31, 0x38, - 0x2c, 0x20, 0x34, 0x38, 0x32, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x31, - 0x31, 0x37, 0x2c, 0x20, 0x34, 0x38, 0x31, 0x2c, 0x20, 0x31, 0x31, 0x36, - 0x2c, 0x20, 0x34, 0x38, 0x30, 0x2c, 0x20, 0x31, 0x31, 0x35, 0x2c, 0x20, - 0x34, 0x37, 0x39, 0x2c, 0x20, 0x31, 0x31, 0x34, 0x2c, 0x20, 0x34, 0x37, - 0x38, 0x2c, 0x20, 0x31, 0x31, 0x33, 0x2c, 0x20, 0x34, 0x37, 0x37, 0x2c, - 0x20, 0x31, 0x31, 0x32, 0x2c, 0x20, 0x34, 0x37, 0x36, 0x2c, 0x20, 0x31, - 0x31, 0x31, 0x2c, 0x20, 0x34, 0x37, 0x35, 0x2c, 0x20, 0x31, 0x31, 0x30, - 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x34, 0x37, 0x34, 0x2c, 0x20, 0x31, - 0x30, 0x39, 0x2c, 0x20, 0x34, 0x37, 0x33, 0x2c, 0x20, 0x31, 0x30, 0x38, - 0x2c, 0x20, 0x34, 0x37, 0x32, 0x2c, 0x20, 0x31, 0x30, 0x37, 0x2c, 0x20, - 0x34, 0x37, 0x31, 0x2c, 0x20, 0x31, 0x30, 0x36, 0x2c, 0x20, 0x34, 0x37, - 0x30, 0x2c, 0x20, 0x31, 0x30, 0x35, 0x2c, 0x20, 0x34, 0x36, 0x39, 0x2c, - 0x20, 0x31, 0x30, 0x34, 0x2c, 0x20, 0x34, 0x36, 0x38, 0x2c, 0x20, 0x31, - 0x30, 0x33, 0x2c, 0x20, 0x34, 0x36, 0x37, 0x2c, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x31, 0x30, 0x32, 0x2c, 0x20, 0x34, 0x36, 0x36, 0x2c, 0x20, 0x31, - 0x30, 0x31, 0x2c, 0x20, 0x34, 0x36, 0x35, 0x2c, 0x20, 0x31, 0x30, 0x30, - 0x2c, 0x20, 0x34, 0x36, 0x34, 0x2c, 0x20, 0x39, 0x39, 0x2c, 0x20, 0x20, - 0x34, 0x36, 0x33, 0x2c, 0x20, 0x39, 0x38, 0x2c, 0x20, 0x20, 0x34, 0x36, - 0x32, 0x2c, 0x20, 0x39, 0x37, 0x2c, 0x20, 0x20, 0x34, 0x36, 0x31, 0x2c, - 0x20, 0x39, 0x36, 0x2c, 0x20, 0x20, 0x34, 0x36, 0x30, 0x2c, 0x20, 0x39, - 0x35, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x34, 0x35, 0x39, 0x2c, 0x20, - 0x39, 0x34, 0x2c, 0x20, 0x20, 0x34, 0x35, 0x38, 0x2c, 0x20, 0x39, 0x33, - 0x2c, 0x20, 0x20, 0x34, 0x35, 0x37, 0x2c, 0x20, 0x39, 0x32, 0x2c, 0x20, - 0x20, 0x34, 0x35, 0x36, 0x2c, 0x20, 0x39, 0x31, 0x2c, 0x20, 0x20, 0x34, - 0x35, 0x35, 0x2c, 0x20, 0x39, 0x30, 0x2c, 0x20, 0x20, 0x34, 0x35, 0x34, - 0x2c, 0x20, 0x38, 0x39, 0x2c, 0x20, 0x20, 0x34, 0x35, 0x33, 0x2c, 0x20, - 0x38, 0x38, 0x2c, 0x20, 0x20, 0x34, 0x35, 0x32, 0x2c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x38, 0x37, 0x2c, 0x20, 0x20, 0x34, 0x35, 0x31, 0x2c, 0x20, - 0x38, 0x36, 0x2c, 0x20, 0x20, 0x34, 0x35, 0x30, 0x2c, 0x20, 0x38, 0x35, - 0x2c, 0x20, 0x20, 0x34, 0x34, 0x39, 0x2c, 0x20, 0x38, 0x34, 0x2c, 0x20, - 0x20, 0x34, 0x34, 0x38, 0x2c, 0x20, 0x38, 0x33, 0x2c, 0x20, 0x20, 0x34, - 0x34, 0x37, 0x2c, 0x20, 0x38, 0x32, 0x2c, 0x20, 0x20, 0x34, 0x34, 0x36, - 0x2c, 0x20, 0x38, 0x31, 0x2c, 0x20, 0x20, 0x34, 0x34, 0x35, 0x2c, 0x20, - 0x38, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x34, 0x34, 0x34, 0x2c, - 0x20, 0x37, 0x39, 0x2c, 0x20, 0x20, 0x34, 0x34, 0x33, 0x2c, 0x20, 0x37, - 0x38, 0x2c, 0x20, 0x20, 0x34, 0x34, 0x32, 0x2c, 0x20, 0x37, 0x37, 0x2c, - 0x20, 0x20, 0x34, 0x34, 0x31, 0x2c, 0x20, 0x37, 0x36, 0x2c, 0x20, 0x20, - 0x34, 0x34, 0x30, 0x2c, 0x20, 0x37, 0x35, 0x2c, 0x20, 0x20, 0x34, 0x33, - 0x39, 0x2c, 0x20, 0x37, 0x34, 0x2c, 0x20, 0x20, 0x34, 0x33, 0x38, 0x2c, - 0x20, 0x37, 0x33, 0x2c, 0x20, 0x20, 0x34, 0x33, 0x37, 0x2c, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x37, 0x32, 0x2c, 0x20, 0x20, 0x34, 0x33, 0x36, 0x2c, - 0x20, 0x37, 0x31, 0x2c, 0x20, 0x20, 0x34, 0x33, 0x35, 0x2c, 0x20, 0x37, - 0x30, 0x2c, 0x20, 0x20, 0x34, 0x33, 0x34, 0x2c, 0x20, 0x36, 0x39, 0x2c, - 0x20, 0x20, 0x34, 0x33, 0x33, 0x2c, 0x20, 0x36, 0x38, 0x2c, 0x20, 0x20, - 0x34, 0x33, 0x32, 0x2c, 0x20, 0x36, 0x37, 0x2c, 0x20, 0x20, 0x34, 0x33, - 0x31, 0x2c, 0x20, 0x36, 0x36, 0x2c, 0x20, 0x20, 0x34, 0x33, 0x30, 0x2c, - 0x20, 0x36, 0x35, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x34, 0x32, 0x39, - 0x2c, 0x20, 0x36, 0x34, 0x2c, 0x20, 0x20, 0x34, 0x32, 0x38, 0x2c, 0x20, - 0x36, 0x33, 0x2c, 0x20, 0x20, 0x34, 0x32, 0x37, 0x2c, 0x20, 0x36, 0x32, - 0x2c, 0x20, 0x20, 0x34, 0x32, 0x36, 0x2c, 0x20, 0x36, 0x31, 0x2c, 0x20, - 0x20, 0x34, 0x32, 0x35, 0x2c, 0x20, 0x36, 0x30, 0x2c, 0x20, 0x20, 0x34, - 0x32, 0x34, 0x2c, 0x20, 0x35, 0x39, 0x2c, 0x20, 0x20, 0x34, 0x32, 0x33, - 0x2c, 0x20, 0x35, 0x38, 0x2c, 0x20, 0x20, 0x34, 0x32, 0x32, 0x2c, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x35, 0x37, 0x2c, 0x20, 0x20, 0x34, 0x32, 0x31, - 0x2c, 0x20, 0x35, 0x36, 0x2c, 0x20, 0x20, 0x34, 0x32, 0x30, 0x2c, 0x20, - 0x35, 0x35, 0x2c, 0x20, 0x20, 0x34, 0x31, 0x39, 0x2c, 0x20, 0x35, 0x34, - 0x2c, 0x20, 0x20, 0x34, 0x31, 0x38, 0x2c, 0x20, 0x35, 0x33, 0x2c, 0x20, - 0x20, 0x34, 0x31, 0x37, 0x2c, 0x20, 0x35, 0x32, 0x2c, 0x20, 0x20, 0x34, - 0x31, 0x36, 0x2c, 0x20, 0x35, 0x31, 0x2c, 0x20, 0x20, 0x34, 0x31, 0x35, - 0x2c, 0x20, 0x35, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x34, 0x31, - 0x34, 0x2c, 0x20, 0x34, 0x39, 0x2c, 0x20, 0x20, 0x34, 0x31, 0x33, 0x2c, - 0x20, 0x34, 0x38, 0x2c, 0x20, 0x20, 0x34, 0x31, 0x32, 0x2c, 0x20, 0x34, - 0x37, 0x2c, 0x20, 0x20, 0x34, 0x31, 0x31, 0x2c, 0x20, 0x34, 0x36, 0x2c, - 0x20, 0x20, 0x34, 0x31, 0x30, 0x2c, 0x20, 0x34, 0x35, 0x2c, 0x20, 0x20, - 0x34, 0x30, 0x39, 0x2c, 0x20, 0x34, 0x34, 0x2c, 0x20, 0x20, 0x34, 0x30, - 0x38, 0x2c, 0x20, 0x34, 0x33, 0x2c, 0x20, 0x20, 0x34, 0x30, 0x37, 0x2c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x34, 0x32, 0x2c, 0x20, 0x20, 0x34, 0x30, - 0x36, 0x2c, 0x20, 0x34, 0x31, 0x2c, 0x20, 0x20, 0x34, 0x30, 0x35, 0x2c, - 0x20, 0x34, 0x30, 0x2c, 0x20, 0x20, 0x34, 0x30, 0x34, 0x2c, 0x20, 0x33, - 0x39, 0x2c, 0x20, 0x20, 0x34, 0x30, 0x33, 0x2c, 0x20, 0x33, 0x38, 0x2c, - 0x20, 0x20, 0x34, 0x30, 0x32, 0x2c, 0x20, 0x33, 0x37, 0x2c, 0x20, 0x20, - 0x34, 0x30, 0x31, 0x2c, 0x20, 0x33, 0x36, 0x2c, 0x20, 0x20, 0x34, 0x30, - 0x30, 0x2c, 0x20, 0x33, 0x35, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x33, - 0x39, 0x39, 0x2c, 0x20, 0x33, 0x34, 0x2c, 0x20, 0x20, 0x33, 0x39, 0x38, - 0x2c, 0x20, 0x33, 0x33, 0x2c, 0x20, 0x20, 0x33, 0x39, 0x37, 0x2c, 0x20, - 0x33, 0x32, 0x2c, 0x20, 0x20, 0x33, 0x39, 0x36, 0x2c, 0x20, 0x33, 0x31, - 0x2c, 0x20, 0x20, 0x33, 0x39, 0x35, 0x2c, 0x20, 0x33, 0x30, 0x2c, 0x20, - 0x20, 0x33, 0x39, 0x34, 0x2c, 0x20, 0x32, 0x39, 0x2c, 0x20, 0x20, 0x33, - 0x39, 0x33, 0x2c, 0x20, 0x32, 0x38, 0x2c, 0x20, 0x20, 0x33, 0x39, 0x32, - 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x32, 0x37, 0x2c, 0x20, 0x20, 0x33, - 0x39, 0x31, 0x2c, 0x20, 0x32, 0x36, 0x2c, 0x20, 0x20, 0x33, 0x39, 0x30, - 0x2c, 0x20, 0x32, 0x35, 0x2c, 0x20, 0x20, 0x33, 0x38, 0x39, 0x2c, 0x20, - 0x32, 0x34, 0x2c, 0x20, 0x20, 0x33, 0x38, 0x38, 0x2c, 0x20, 0x32, 0x33, - 0x2c, 0x20, 0x20, 0x33, 0x38, 0x37, 0x2c, 0x20, 0x32, 0x32, 0x2c, 0x20, - 0x20, 0x33, 0x38, 0x36, 0x2c, 0x20, 0x32, 0x31, 0x2c, 0x20, 0x20, 0x33, - 0x38, 0x35, 0x2c, 0x20, 0x32, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x33, 0x38, 0x34, 0x2c, 0x20, 0x31, 0x39, 0x2c, 0x20, 0x20, 0x33, 0x38, - 0x33, 0x2c, 0x20, 0x31, 0x38, 0x2c, 0x20, 0x20, 0x33, 0x38, 0x32, 0x2c, - 0x20, 0x31, 0x37, 0x2c, 0x20, 0x20, 0x33, 0x38, 0x31, 0x2c, 0x20, 0x31, - 0x36, 0x2c, 0x20, 0x20, 0x33, 0x38, 0x30, 0x2c, 0x20, 0x31, 0x35, 0x2c, - 0x20, 0x20, 0x33, 0x37, 0x39, 0x2c, 0x20, 0x31, 0x34, 0x2c, 0x20, 0x20, - 0x33, 0x37, 0x38, 0x2c, 0x20, 0x31, 0x33, 0x2c, 0x20, 0x20, 0x33, 0x37, - 0x37, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x31, 0x32, 0x2c, 0x20, 0x20, - 0x33, 0x37, 0x36, 0x2c, 0x20, 0x31, 0x31, 0x2c, 0x20, 0x20, 0x33, 0x37, - 0x35, 0x2c, 0x20, 0x31, 0x30, 0x2c, 0x20, 0x20, 0x33, 0x37, 0x34, 0x2c, - 0x20, 0x39, 0x2c, 0x20, 0x20, 0x20, 0x33, 0x37, 0x33, 0x2c, 0x20, 0x38, - 0x2c, 0x20, 0x20, 0x20, 0x33, 0x37, 0x32, 0x2c, 0x20, 0x37, 0x2c, 0x20, - 0x20, 0x20, 0x33, 0x37, 0x31, 0x2c, 0x20, 0x36, 0x2c, 0x20, 0x20, 0x20, - 0x33, 0x37, 0x30, 0x2c, 0x20, 0x35, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x33, 0x36, 0x39, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x20, 0x20, 0x33, 0x36, - 0x38, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x20, 0x20, 0x33, 0x36, 0x37, 0x2c, - 0x20, 0x32, 0x2c, 0x20, 0x20, 0x20, 0x33, 0x36, 0x36, 0x2c, 0x20, 0x31, - 0x2c, 0x20, 0x20, 0x20, 0x33, 0x36, 0x35, 0x2c, 0x20, 0x30, 0x7d, 0x3b, - 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x74, 0x32, 0x20, - 0x3d, 0x20, 0x28, 0x28, 0x6a, 0x25, 0x32, 0x29, 0x2b, 0x31, 0x29, 0x2a, - 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, - 0x2d, 0x20, 0x28, 0x28, 0x6a, 0x29, 0x3e, 0x3e, 0x31, 0x29, 0x3b, 0x0a, - 0x20, 0x2a, 0x2f, 0x0a, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, - 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, - 0x74, 0x5f, 0x74, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x69, - 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x5f, 0x5f, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, - 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x77, - 0x2c, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, - 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, - 0x64, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, - 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, - 0x65, 0x5f, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x2c, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, - 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x74, 0x6f, 0x5f, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, - 0x20, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x6d, 0x69, 0x64, 0x5f, 0x74, 0x6f, - 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x28, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, - 0x74, 0x2a, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x77, 0x2c, 0x20, - 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, - 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, 0x64, 0x5f, - 0x68, 0x69, 0x67, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, - 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x77, 0x2c, 0x20, - 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, - 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, - 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, - 0x69, 0x64, 0x2c, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, - 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x6c, 0x5f, 0x73, - 0x69, 0x7a, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, - 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x6c, 0x5f, 0x74, - 0x72, 0x69, 0x74, 0x73, 0x29, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x5f, 0x5f, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, - 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, - 0x6c, 0x6f, 0x77, 0x2c, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, - 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x2c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, - 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x69, 0x64, 0x2c, - 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, - 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, - 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, - 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x6c, 0x5f, - 0x74, 0x72, 0x69, 0x74, 0x73, 0x29, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, - 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, - 0x74, 0x2a, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x77, - 0x2c, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, - 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x2c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x76, 0x6f, 0x6c, 0x61, 0x74, 0x69, - 0x6c, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x2a, 0x20, 0x66, 0x6f, 0x75, - 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x74, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, - 0x6e, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x6d, 0x61, 0x67, - 0x6e, 0x69, 0x74, 0x75, 0x64, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, - 0x74, 0x2a, 0x20, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, - 0x62, 0x65, 0x2c, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, - 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x67, 0x72, 0x5f, - 0x69, 0x64, 0x29, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x73, 0x65, - 0x74, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x73, 0x28, 0x5f, 0x5f, 0x70, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, - 0x2a, 0x20, 0x69, 0x64, 0x2c, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x2a, 0x20, - 0x67, 0x69, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x70, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, - 0x2a, 0x20, 0x67, 0x72, 0x5f, 0x69, 0x64, 0x2c, 0x20, 0x5f, 0x5f, 0x70, - 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, - 0x74, 0x2a, 0x20, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, - 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x2a, 0x20, 0x6e, 0x5f, 0x74, 0x72, - 0x69, 0x74, 0x73, 0x29, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, - 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x5f, 0x5f, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, - 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x6c, 0x6f, - 0x77, 0x2c, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, - 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6d, - 0x69, 0x64, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, - 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x2c, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, - 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x74, 0x6f, - 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, - 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x69, 0x3b, 0x0a, 0x20, 0x20, - 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x20, 0x63, 0x61, - 0x72, 0x72, 0x79, 0x20, 0x3d, 0x20, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x62, - 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x20, 0x6c, 0x6f, 0x77, - 0x2c, 0x20, 0x68, 0x69, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x28, 0x69, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x74, 0x6f, 0x5f, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x26, 0x26, 0x20, 0x63, 0x61, 0x72, - 0x72, 0x79, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x2b, 0x2b, - 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x20, - 0x3d, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x77, 0x5b, 0x69, 0x5d, - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x20, 0x3d, 0x20, 0x6d, - 0x69, 0x64, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5b, 0x69, 0x5d, 0x3b, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x77, 0x5b, - 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x68, 0x69, 0x20, 0x5e, 0x20, 0x6c, 0x6f, - 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x68, - 0x69, 0x67, 0x68, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x77, - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x72, 0x72, 0x79, 0x20, - 0x3d, 0x20, 0x68, 0x69, 0x20, 0x26, 0x20, 0x28, 0x7e, 0x6c, 0x6f, 0x77, - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, 0x76, 0x6f, - 0x69, 0x64, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x6d, 0x69, 0x64, 0x5f, - 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x28, 0x5f, 0x5f, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, - 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x77, - 0x2c, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, - 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, - 0x64, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, - 0x74, 0x2a, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x77, - 0x2c, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, - 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x2c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x70, - 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, - 0x74, 0x20, 0x69, 0x64, 0x2c, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x6c, - 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x6e, - 0x5f, 0x74, 0x72, 0x69, 0x74, 0x73, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, - 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x69, 0x2c, 0x20, 0x6a, 0x3b, - 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x20, 0x3d, 0x20, - 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x6e, 0x5f, 0x74, 0x72, 0x69, - 0x74, 0x73, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x69, 0x64, 0x20, 0x2b, 0x20, - 0x69, 0x20, 0x2a, 0x20, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x3b, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, - 0x77, 0x5b, 0x6a, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x6c, - 0x6f, 0x77, 0x5b, 0x6a, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5b, 0x6a, 0x5d, - 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5b, - 0x6a, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, 0x76, - 0x6f, 0x69, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, - 0x6d, 0x28, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, - 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x77, 0x2c, 0x20, 0x5f, 0x5f, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, - 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x68, - 0x69, 0x67, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x70, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, - 0x20, 0x69, 0x64, 0x2c, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, - 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x6c, 0x5f, - 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x70, - 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, - 0x74, 0x20, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x73, 0x29, 0x20, 0x7b, - 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x72, 0x6f, 0x75, 0x6e, - 0x64, 0x2c, 0x20, 0x69, 0x2c, 0x20, 0x6a, 0x2c, 0x20, 0x6b, 0x3b, 0x0a, - 0x20, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, - 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x20, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x2c, 0x20, 0x62, 0x65, 0x74, 0x61, 0x2c, 0x20, 0x67, - 0x61, 0x6d, 0x6d, 0x61, 0x2c, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x2c, - 0x20, 0x73, 0x70, 0x5f, 0x6c, 0x6f, 0x77, 0x5b, 0x33, 0x5d, 0x2c, 0x20, - 0x73, 0x70, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, - 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x72, 0x6f, 0x75, 0x6e, 0x64, - 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x20, - 0x3c, 0x20, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x5f, 0x4f, 0x46, 0x5f, - 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x53, 0x3b, 0x20, 0x72, 0x6f, 0x75, 0x6e, - 0x64, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x28, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, - 0x20, 0x3c, 0x20, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x73, 0x3b, 0x20, - 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x69, 0x64, 0x20, 0x2b, 0x20, 0x69, 0x20, - 0x2a, 0x20, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x3b, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x6b, 0x20, 0x3d, 0x20, 0x6a, 0x2b, 0x31, 0x3b, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x77, - 0x5b, 0x49, 0x4e, 0x44, 0x45, 0x58, 0x5b, 0x6a, 0x5d, 0x5d, 0x3b, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x65, 0x74, 0x61, 0x20, 0x3d, - 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5b, - 0x49, 0x4e, 0x44, 0x45, 0x58, 0x5b, 0x6a, 0x5d, 0x5d, 0x3b, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x61, 0x6d, 0x6d, 0x61, 0x20, 0x3d, - 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5b, - 0x49, 0x4e, 0x44, 0x45, 0x58, 0x5b, 0x6b, 0x5d, 0x5d, 0x3b, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x3d, - 0x20, 0x28, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x20, 0x7c, 0x20, 0x28, 0x7e, - 0x67, 0x61, 0x6d, 0x6d, 0x61, 0x29, 0x29, 0x20, 0x26, 0x20, 0x28, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x77, 0x5b, 0x49, 0x4e, 0x44, - 0x45, 0x58, 0x5b, 0x6b, 0x5d, 0x5d, 0x20, 0x5e, 0x20, 0x62, 0x65, 0x74, - 0x61, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, - 0x70, 0x5f, 0x6c, 0x6f, 0x77, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x7e, - 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x73, 0x70, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5b, 0x69, 0x5d, 0x20, - 0x3d, 0x20, 0x28, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x20, 0x5e, 0x20, 0x67, - 0x61, 0x6d, 0x6d, 0x61, 0x29, 0x20, 0x7c, 0x20, 0x64, 0x65, 0x6c, 0x74, - 0x61, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x43, 0x4c, 0x4b, - 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x5f, 0x4d, 0x45, 0x4d, 0x5f, 0x46, - 0x45, 0x4e, 0x43, 0x45, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x28, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, - 0x20, 0x3c, 0x20, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x73, 0x3b, 0x20, - 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x69, 0x64, 0x20, 0x2b, 0x20, 0x69, 0x20, - 0x2a, 0x20, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x3b, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, - 0x77, 0x5b, 0x6a, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x5f, 0x6c, 0x6f, - 0x77, 0x5b, 0x69, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5b, 0x6a, - 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5b, - 0x69, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x43, 0x4c, - 0x4b, 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x5f, 0x4d, 0x45, 0x4d, 0x5f, - 0x46, 0x45, 0x4e, 0x43, 0x45, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, - 0x7d, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x63, 0x68, 0x65, 0x63, - 0x6b, 0x28, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, - 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x77, 0x2c, 0x20, 0x5f, 0x5f, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, - 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x68, - 0x69, 0x67, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x20, 0x76, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6c, 0x65, 0x20, 0x63, 0x68, - 0x61, 0x72, 0x2a, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x2c, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, - 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x7a, - 0x65, 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, 0x6e, 0x5f, 0x77, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x5f, 0x6d, 0x61, 0x67, 0x6e, 0x69, 0x74, 0x75, 0x64, - 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, - 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6e, 0x6f, - 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x2c, 0x20, 0x5f, - 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, - 0x65, 0x5f, 0x74, 0x20, 0x67, 0x72, 0x5f, 0x69, 0x64, 0x29, 0x20, 0x7b, - 0x0a, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x3b, 0x0a, 0x20, 0x20, - 0x2a, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x65, - 0x20, 0x3d, 0x20, 0x48, 0x49, 0x47, 0x48, 0x5f, 0x42, 0x49, 0x54, 0x53, - 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x20, 0x3d, - 0x20, 0x48, 0x41, 0x53, 0x48, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, - 0x20, 0x2d, 0x20, 0x2a, 0x6d, 0x69, 0x6e, 0x5f, 0x77, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x5f, 0x6d, 0x61, 0x67, 0x6e, 0x69, 0x74, 0x75, 0x64, 0x65, - 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x48, 0x41, 0x53, 0x48, 0x5f, 0x4c, - 0x45, 0x4e, 0x47, 0x54, 0x48, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, - 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x6e, 0x6f, 0x6e, 0x63, 0x65, - 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x20, 0x26, 0x3d, 0x20, 0x7e, 0x28, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x77, 0x5b, 0x69, 0x5d, - 0x20, 0x5e, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x68, 0x69, 0x67, - 0x68, 0x5b, 0x69, 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x28, 0x2a, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, - 0x6f, 0x62, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, - 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x2a, 0x6e, - 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x20, 0x21, - 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, - 0x2f, 0x2a, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x62, - 0x65, 0x20, 0x3d, 0x20, 0x31, 0x20, 0x3c, 0x3c, 0x20, 0x5f, 0x5f, 0x62, - 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x63, 0x74, 0x7a, 0x6c, 0x28, - 0x2a, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x65, - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x66, 0x6f, 0x75, 0x6e, - 0x64, 0x20, 0x3d, 0x20, 0x67, 0x72, 0x5f, 0x69, 0x64, 0x20, 0x2b, 0x20, - 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, 0x76, 0x6f, - 0x69, 0x64, 0x20, 0x73, 0x65, 0x74, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x73, - 0x28, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, - 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x2a, 0x20, 0x69, 0x64, 0x2c, 0x20, 0x5f, - 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, - 0x65, 0x5f, 0x74, 0x2a, 0x20, 0x67, 0x69, 0x64, 0x2c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, - 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x2a, 0x20, 0x67, 0x72, 0x5f, 0x69, 0x64, - 0x2c, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, - 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x2a, 0x20, 0x6c, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, - 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x2a, - 0x20, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x73, 0x29, 0x20, 0x7b, 0x0a, - 0x20, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, - 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x6c, 0x5f, 0x72, 0x65, 0x6d, - 0x3b, 0x0a, 0x20, 0x20, 0x2a, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x67, 0x65, - 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x2a, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, - 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, - 0x2a, 0x67, 0x72, 0x5f, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, - 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, - 0x29, 0x20, 0x2f, 0x20, 0x2a, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x3b, - 0x0a, 0x20, 0x20, 0x2a, 0x67, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x2a, 0x67, - 0x72, 0x5f, 0x69, 0x64, 0x20, 0x2a, 0x20, 0x53, 0x54, 0x41, 0x54, 0x45, - 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x3b, 0x0a, 0x20, 0x20, 0x6c, - 0x5f, 0x72, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x53, 0x54, 0x41, 0x54, 0x45, - 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, 0x25, 0x20, 0x2a, 0x6c, - 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x2a, 0x6e, 0x5f, - 0x74, 0x72, 0x69, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x53, 0x54, 0x41, 0x54, - 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, 0x2f, 0x20, 0x2a, - 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x2a, 0x6e, - 0x5f, 0x74, 0x72, 0x69, 0x74, 0x73, 0x20, 0x2b, 0x3d, 0x20, 0x6c, 0x5f, - 0x72, 0x65, 0x6d, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x3f, 0x20, 0x30, - 0x20, 0x3a, 0x20, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x2a, 0x6e, 0x5f, 0x74, - 0x72, 0x69, 0x74, 0x73, 0x20, 0x2d, 0x3d, 0x20, 0x28, 0x2a, 0x6e, 0x5f, - 0x74, 0x72, 0x69, 0x74, 0x73, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x2a, 0x69, - 0x64, 0x29, 0x20, 0x3c, 0x20, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x4c, - 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, 0x3f, 0x20, 0x30, 0x20, 0x3a, 0x20, - 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x5f, 0x5f, 0x6b, 0x65, 0x72, 0x6e, - 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x69, 0x74, - 0x28, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x63, 0x68, - 0x61, 0x72, 0x2a, 0x20, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x68, 0x61, 0x73, - 0x68, 0x2c, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, - 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6d, - 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x77, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, - 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6d, - 0x69, 0x64, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x2c, 0x20, 0x5f, 0x5f, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, - 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, - 0x6f, 0x77, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, - 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, - 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x5f, 0x68, 0x69, 0x67, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, - 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, 0x6e, - 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x6d, 0x61, 0x67, 0x6e, - 0x69, 0x74, 0x75, 0x64, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x76, - 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6c, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, - 0x2a, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x2c, 0x20, 0x5f, 0x5f, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, - 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x70, - 0x72, 0x6f, 0x62, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x5f, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, - 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x2a, 0x20, 0x6c, 0x6f, 0x6f, 0x70, - 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, - 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, - 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x69, 0x2c, 0x20, 0x6a, 0x2c, 0x20, 0x69, - 0x64, 0x2c, 0x20, 0x67, 0x69, 0x64, 0x2c, 0x20, 0x67, 0x72, 0x5f, 0x69, - 0x64, 0x2c, 0x20, 0x67, 0x6c, 0x5f, 0x6f, 0x66, 0x66, 0x2c, 0x20, 0x6c, - 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x6e, 0x5f, 0x74, 0x72, 0x69, - 0x74, 0x73, 0x3b, 0x0a, 0x20, 0x20, 0x73, 0x65, 0x74, 0x75, 0x70, 0x5f, - 0x69, 0x64, 0x73, 0x28, 0x26, 0x69, 0x64, 0x2c, 0x20, 0x26, 0x67, 0x69, - 0x64, 0x2c, 0x20, 0x26, 0x67, 0x72, 0x5f, 0x69, 0x64, 0x2c, 0x20, 0x26, - 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x26, 0x6e, 0x5f, 0x74, - 0x72, 0x69, 0x74, 0x73, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, - 0x6f, 0x66, 0x66, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, - 0x30, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, - 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x26, 0x26, 0x20, 0x67, 0x72, - 0x5f, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x2a, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x3d, - 0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x69, - 0x66, 0x20, 0x28, 0x67, 0x72, 0x5f, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x20, - 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, - 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x6e, 0x5f, - 0x74, 0x72, 0x69, 0x74, 0x73, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, - 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x69, 0x64, - 0x20, 0x2b, 0x20, 0x69, 0x20, 0x2a, 0x20, 0x6c, 0x5f, 0x73, 0x69, 0x7a, - 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x6c, - 0x6f, 0x77, 0x5b, 0x67, 0x69, 0x64, 0x20, 0x2b, 0x20, 0x6a, 0x5d, 0x20, - 0x3d, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x77, 0x5b, 0x6a, 0x5d, - 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x68, 0x69, - 0x67, 0x68, 0x5b, 0x67, 0x69, 0x64, 0x20, 0x2b, 0x20, 0x6a, 0x5d, 0x20, - 0x3d, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5b, 0x6a, - 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x69, 0x66, - 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x20, - 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x67, 0x72, 0x5f, - 0x69, 0x64, 0x20, 0x2b, 0x20, 0x67, 0x6c, 0x5f, 0x6f, 0x66, 0x66, 0x3b, - 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, - 0x26, 0x28, 0x6d, 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x77, 0x5b, 0x67, 0x69, - 0x64, 0x5d, 0x29, 0x2c, 0x20, 0x26, 0x28, 0x6d, 0x69, 0x64, 0x5f, 0x68, - 0x69, 0x67, 0x68, 0x5b, 0x67, 0x69, 0x64, 0x5d, 0x29, 0x2c, 0x20, 0x4e, - 0x4f, 0x4e, 0x43, 0x45, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x5f, 0x53, 0x54, - 0x41, 0x52, 0x54, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x4f, 0x4e, - 0x43, 0x45, 0x5f, 0x49, 0x4e, 0x43, 0x52, 0x45, 0x4d, 0x45, 0x4e, 0x54, - 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, 0x5f, 0x5f, - 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x28, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x2a, 0x20, 0x74, 0x72, - 0x69, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x2c, 0x20, 0x5f, 0x5f, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, - 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x77, - 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, - 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, - 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x68, - 0x69, 0x67, 0x68, 0x2c, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, - 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x77, 0x2c, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, - 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x68, - 0x69, 0x67, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, - 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, 0x6e, - 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x6d, 0x61, 0x67, 0x6e, - 0x69, 0x74, 0x75, 0x64, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x20, 0x76, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6c, 0x65, 0x20, 0x63, 0x68, - 0x61, 0x72, 0x2a, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x2c, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, - 0x5f, 0x74, 0x2a, 0x20, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, - 0x6f, 0x62, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, - 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x2a, 0x20, 0x6c, 0x6f, 0x6f, - 0x70, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x29, 0x20, 0x7b, 0x0a, 0x20, - 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, - 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x69, 0x2c, 0x20, 0x69, 0x64, 0x2c, - 0x20, 0x67, 0x69, 0x64, 0x2c, 0x20, 0x67, 0x72, 0x5f, 0x69, 0x64, 0x2c, - 0x20, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x6e, 0x5f, 0x74, - 0x72, 0x69, 0x74, 0x73, 0x3b, 0x0a, 0x20, 0x20, 0x73, 0x65, 0x74, 0x75, - 0x70, 0x5f, 0x69, 0x64, 0x73, 0x28, 0x26, 0x69, 0x64, 0x2c, 0x20, 0x26, - 0x67, 0x69, 0x64, 0x2c, 0x20, 0x26, 0x67, 0x72, 0x5f, 0x69, 0x64, 0x2c, - 0x20, 0x26, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x26, 0x6e, - 0x5f, 0x74, 0x72, 0x69, 0x74, 0x73, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, - 0x69, 0x20, 0x3c, 0x20, 0x2a, 0x6c, 0x6f, 0x6f, 0x70, 0x5f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, - 0x3d, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, - 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x26, 0x28, 0x6d, - 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x77, 0x5b, 0x67, 0x69, 0x64, 0x5d, 0x29, - 0x2c, 0x20, 0x26, 0x28, 0x6d, 0x69, 0x64, 0x5f, 0x68, 0x69, 0x67, 0x68, - 0x5b, 0x67, 0x69, 0x64, 0x5d, 0x29, 0x2c, 0x20, 0x4e, 0x4f, 0x4e, 0x43, - 0x45, 0x5f, 0x49, 0x4e, 0x43, 0x52, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x5f, - 0x53, 0x54, 0x41, 0x52, 0x54, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x48, - 0x41, 0x53, 0x48, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x29, 0x3b, - 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, - 0x72, 0x28, 0x43, 0x4c, 0x4b, 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x5f, - 0x4d, 0x45, 0x4d, 0x5f, 0x46, 0x45, 0x4e, 0x43, 0x45, 0x29, 0x3b, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x6d, 0x69, 0x64, - 0x5f, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x28, 0x26, 0x28, - 0x6d, 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x77, 0x5b, 0x67, 0x69, 0x64, 0x5d, - 0x29, 0x2c, 0x20, 0x26, 0x28, 0x6d, 0x69, 0x64, 0x5f, 0x68, 0x69, 0x67, - 0x68, 0x5b, 0x67, 0x69, 0x64, 0x5d, 0x29, 0x2c, 0x20, 0x26, 0x28, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x77, 0x5b, 0x67, 0x69, 0x64, - 0x5d, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x26, 0x28, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x68, 0x69, - 0x67, 0x68, 0x5b, 0x67, 0x69, 0x64, 0x5d, 0x29, 0x2c, 0x20, 0x69, 0x64, - 0x2c, 0x20, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x6e, 0x5f, - 0x74, 0x72, 0x69, 0x74, 0x73, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x43, 0x4c, 0x4b, - 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x5f, 0x4d, 0x45, 0x4d, 0x5f, 0x46, - 0x45, 0x4e, 0x43, 0x45, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x26, 0x28, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x77, 0x5b, 0x67, 0x69, 0x64, - 0x5d, 0x29, 0x2c, 0x20, 0x26, 0x28, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, - 0x68, 0x69, 0x67, 0x68, 0x5b, 0x67, 0x69, 0x64, 0x5d, 0x29, 0x2c, 0x20, - 0x69, 0x64, 0x2c, 0x20, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, - 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x73, 0x29, 0x3b, 0x0a, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x43, - 0x4c, 0x4b, 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x5f, 0x4d, 0x45, 0x4d, - 0x5f, 0x46, 0x45, 0x4e, 0x43, 0x45, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x30, - 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, - 0x6b, 0x28, 0x26, 0x28, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, - 0x77, 0x5b, 0x67, 0x69, 0x64, 0x5d, 0x29, 0x2c, 0x20, 0x26, 0x28, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5b, 0x67, 0x69, - 0x64, 0x5d, 0x29, 0x2c, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x2c, 0x20, - 0x6d, 0x69, 0x6e, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x6d, - 0x61, 0x67, 0x6e, 0x69, 0x74, 0x75, 0x64, 0x65, 0x2c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x26, 0x28, - 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x5b, - 0x67, 0x72, 0x5f, 0x69, 0x64, 0x5d, 0x29, 0x2c, 0x20, 0x67, 0x72, 0x5f, - 0x69, 0x64, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, - 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x43, 0x4c, 0x4b, 0x5f, 0x4c, 0x4f, - 0x43, 0x41, 0x4c, 0x5f, 0x4d, 0x45, 0x4d, 0x5f, 0x46, 0x45, 0x4e, 0x43, - 0x45, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, - 0x2a, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, - 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, 0x5f, 0x5f, 0x6b, - 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x66, - 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x5f, 0x5f, 0x67, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x2a, 0x20, 0x74, - 0x72, 0x69, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x2c, 0x20, 0x5f, 0x5f, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, - 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x6c, 0x6f, - 0x77, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, - 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, - 0x64, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x2c, 0x20, 0x5f, 0x5f, 0x67, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, - 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, - 0x77, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, - 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x2c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x63, - 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x7a, 0x65, - 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, 0x6e, 0x5f, 0x77, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x5f, 0x6d, 0x61, 0x67, 0x6e, 0x69, 0x74, 0x75, 0x64, 0x65, - 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x76, 0x6f, - 0x6c, 0x61, 0x74, 0x69, 0x6c, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x2a, - 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, - 0x74, 0x2a, 0x20, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, - 0x62, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x74, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x2a, 0x20, 0x6c, 0x6f, - 0x6f, 0x70, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x29, 0x20, 0x7b, 0x0a, - 0x20, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, - 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x69, 0x2c, 0x20, 0x6a, 0x2c, - 0x20, 0x69, 0x64, 0x2c, 0x20, 0x67, 0x69, 0x64, 0x2c, 0x20, 0x67, 0x72, - 0x5f, 0x69, 0x64, 0x2c, 0x20, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, - 0x20, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x73, 0x3b, 0x0a, 0x20, 0x20, - 0x73, 0x65, 0x74, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x73, 0x28, 0x26, 0x69, - 0x64, 0x2c, 0x20, 0x26, 0x67, 0x69, 0x64, 0x2c, 0x20, 0x26, 0x67, 0x72, - 0x5f, 0x69, 0x64, 0x2c, 0x20, 0x26, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, - 0x2c, 0x20, 0x26, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x73, 0x29, 0x3b, - 0x0a, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x67, 0x72, 0x5f, 0x69, - 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, - 0x29, 0x28, 0x2a, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x2d, 0x20, 0x31, - 0x29, 0x20, 0x26, 0x26, 0x20, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x70, - 0x72, 0x6f, 0x62, 0x65, 0x5b, 0x67, 0x72, 0x5f, 0x69, 0x64, 0x5d, 0x20, - 0x21, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, - 0x69, 0x20, 0x3c, 0x20, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x73, 0x3b, - 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x69, 0x64, 0x20, 0x2b, 0x20, 0x69, - 0x20, 0x2a, 0x20, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x3b, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6a, 0x20, 0x3c, - 0x20, 0x48, 0x41, 0x53, 0x48, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, - 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x74, 0x72, 0x69, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x5b, 0x6a, 0x5d, - 0x20, 0x3d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x28, 0x6d, 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x77, 0x5b, - 0x67, 0x69, 0x64, 0x20, 0x2b, 0x20, 0x6a, 0x5d, 0x20, 0x26, 0x20, 0x6e, - 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x5b, 0x67, - 0x72, 0x5f, 0x69, 0x64, 0x5d, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x3f, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x3a, 0x20, 0x28, 0x6d, 0x69, 0x64, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5b, - 0x67, 0x69, 0x64, 0x20, 0x2b, 0x20, 0x6a, 0x5d, 0x20, 0x26, 0x20, 0x6e, - 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x5b, 0x67, - 0x72, 0x5f, 0x69, 0x64, 0x5d, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, - 0x3f, 0x20, 0x2d, 0x31, 0x20, 0x3a, 0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, - 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a -}; + 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x48, 0x41, 0x53, 0x48, + 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, 0x32, 0x34, 0x33, 0x0a, + 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x4f, 0x46, 0x46, 0x53, + 0x45, 0x54, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, 0x34, 0x0a, + 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x4e, 0x4f, 0x4e, 0x43, + 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, 0x48, 0x41, 0x53, + 0x48, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, 0x2f, 0x20, 0x33, + 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x49, 0x4e, 0x54, + 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, 0x4e, 0x4f, 0x4e, 0x43, + 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, 0x2f, 0x20, 0x33, + 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x4e, 0x4f, 0x4e, + 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x20, 0x48, 0x41, 0x53, + 0x48, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, 0x2d, 0x20, 0x4e, + 0x4f, 0x4e, 0x43, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x0a, + 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x4e, 0x4f, 0x4e, 0x43, + 0x45, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, + 0x20, 0x4e, 0x4f, 0x4e, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, + 0x20, 0x2b, 0x20, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x5f, 0x4c, 0x45, + 0x4e, 0x47, 0x54, 0x48, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, + 0x20, 0x4e, 0x4f, 0x4e, 0x43, 0x45, 0x5f, 0x49, 0x4e, 0x43, 0x52, 0x45, + 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x20, 0x4e, + 0x4f, 0x4e, 0x43, 0x45, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x5f, 0x53, 0x54, + 0x41, 0x52, 0x54, 0x20, 0x2b, 0x20, 0x49, 0x4e, 0x54, 0x5f, 0x4c, 0x45, + 0x4e, 0x47, 0x54, 0x48, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, + 0x20, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x5f, 0x4f, 0x46, 0x5f, 0x52, + 0x4f, 0x55, 0x4e, 0x44, 0x53, 0x20, 0x38, 0x31, 0x0a, 0x23, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x4c, + 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, 0x33, 0x20, 0x2a, 0x20, 0x48, 0x41, + 0x53, 0x48, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x0a, 0x23, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x4c, + 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, 0x33, 0x36, 0x34, 0x0a, 0x23, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x48, 0x49, 0x47, 0x48, 0x5f, 0x42, + 0x49, 0x54, 0x53, 0x20, 0x30, 0x78, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, + 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x46, 0x0a, 0x23, + 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x4c, 0x4f, 0x57, 0x5f, 0x42, + 0x49, 0x54, 0x53, 0x20, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x2f, + 0x2f, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x48, 0x49, 0x47, + 0x48, 0x5f, 0x42, 0x49, 0x54, 0x53, 0x0a, 0x2f, 0x2f, 0x30, 0x62, 0x31, + 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, + 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, + 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, + 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, + 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, + 0x31, 0x31, 0x31, 0x4c, 0x0a, 0x2f, 0x2f, 0x23, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x65, 0x20, 0x4c, 0x4f, 0x57, 0x5f, 0x42, 0x49, 0x54, 0x53, 0x0a, + 0x2f, 0x2f, 0x30, 0x62, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x4c, 0x0a, 0x2f, 0x2a, + 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x74, 0x31, 0x20, 0x3d, 0x20, 0x6a, 0x20, + 0x3d, 0x3d, 0x20, 0x30, 0x3f, 0x20, 0x30, 0x3a, 0x28, 0x28, 0x28, 0x6a, + 0x20, 0x2d, 0x20, 0x31, 0x29, 0x25, 0x32, 0x29, 0x2b, 0x31, 0x29, 0x2a, + 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, + 0x2d, 0x20, 0x28, 0x28, 0x6a, 0x2d, 0x31, 0x29, 0x3e, 0x3e, 0x31, 0x29, + 0x3b, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x5f, 0x5f, 0x63, 0x6f, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, + 0x49, 0x4e, 0x44, 0x45, 0x58, 0x5b, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, 0x2b, 0x20, 0x31, 0x5d, 0x20, + 0x3d, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x30, 0x2c, 0x20, 0x20, + 0x20, 0x33, 0x36, 0x34, 0x2c, 0x20, 0x37, 0x32, 0x38, 0x2c, 0x20, 0x33, + 0x36, 0x33, 0x2c, 0x20, 0x37, 0x32, 0x37, 0x2c, 0x20, 0x33, 0x36, 0x32, + 0x2c, 0x20, 0x37, 0x32, 0x36, 0x2c, 0x20, 0x33, 0x36, 0x31, 0x2c, 0x20, + 0x37, 0x32, 0x35, 0x2c, 0x20, 0x33, 0x36, 0x30, 0x2c, 0x20, 0x37, 0x32, + 0x34, 0x2c, 0x20, 0x33, 0x35, 0x39, 0x2c, 0x20, 0x37, 0x32, 0x33, 0x2c, + 0x20, 0x33, 0x35, 0x38, 0x2c, 0x20, 0x37, 0x32, 0x32, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x33, 0x35, 0x37, 0x2c, 0x20, 0x37, 0x32, 0x31, 0x2c, + 0x20, 0x33, 0x35, 0x36, 0x2c, 0x20, 0x37, 0x32, 0x30, 0x2c, 0x20, 0x33, + 0x35, 0x35, 0x2c, 0x20, 0x37, 0x31, 0x39, 0x2c, 0x20, 0x33, 0x35, 0x34, + 0x2c, 0x20, 0x37, 0x31, 0x38, 0x2c, 0x20, 0x33, 0x35, 0x33, 0x2c, 0x20, + 0x37, 0x31, 0x37, 0x2c, 0x20, 0x33, 0x35, 0x32, 0x2c, 0x20, 0x37, 0x31, + 0x36, 0x2c, 0x20, 0x33, 0x35, 0x31, 0x2c, 0x20, 0x37, 0x31, 0x35, 0x2c, + 0x20, 0x33, 0x35, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x37, 0x31, + 0x34, 0x2c, 0x20, 0x33, 0x34, 0x39, 0x2c, 0x20, 0x37, 0x31, 0x33, 0x2c, + 0x20, 0x33, 0x34, 0x38, 0x2c, 0x20, 0x37, 0x31, 0x32, 0x2c, 0x20, 0x33, + 0x34, 0x37, 0x2c, 0x20, 0x37, 0x31, 0x31, 0x2c, 0x20, 0x33, 0x34, 0x36, + 0x2c, 0x20, 0x37, 0x31, 0x30, 0x2c, 0x20, 0x33, 0x34, 0x35, 0x2c, 0x20, + 0x37, 0x30, 0x39, 0x2c, 0x20, 0x33, 0x34, 0x34, 0x2c, 0x20, 0x37, 0x30, + 0x38, 0x2c, 0x20, 0x33, 0x34, 0x33, 0x2c, 0x20, 0x37, 0x30, 0x37, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x33, 0x34, 0x32, 0x2c, 0x20, 0x37, 0x30, + 0x36, 0x2c, 0x20, 0x33, 0x34, 0x31, 0x2c, 0x20, 0x37, 0x30, 0x35, 0x2c, + 0x20, 0x33, 0x34, 0x30, 0x2c, 0x20, 0x37, 0x30, 0x34, 0x2c, 0x20, 0x33, + 0x33, 0x39, 0x2c, 0x20, 0x37, 0x30, 0x33, 0x2c, 0x20, 0x33, 0x33, 0x38, + 0x2c, 0x20, 0x37, 0x30, 0x32, 0x2c, 0x20, 0x33, 0x33, 0x37, 0x2c, 0x20, + 0x37, 0x30, 0x31, 0x2c, 0x20, 0x33, 0x33, 0x36, 0x2c, 0x20, 0x37, 0x30, + 0x30, 0x2c, 0x20, 0x33, 0x33, 0x35, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x36, 0x39, 0x39, 0x2c, 0x20, 0x33, 0x33, 0x34, 0x2c, 0x20, 0x36, 0x39, + 0x38, 0x2c, 0x20, 0x33, 0x33, 0x33, 0x2c, 0x20, 0x36, 0x39, 0x37, 0x2c, + 0x20, 0x33, 0x33, 0x32, 0x2c, 0x20, 0x36, 0x39, 0x36, 0x2c, 0x20, 0x33, + 0x33, 0x31, 0x2c, 0x20, 0x36, 0x39, 0x35, 0x2c, 0x20, 0x33, 0x33, 0x30, + 0x2c, 0x20, 0x36, 0x39, 0x34, 0x2c, 0x20, 0x33, 0x32, 0x39, 0x2c, 0x20, + 0x36, 0x39, 0x33, 0x2c, 0x20, 0x33, 0x32, 0x38, 0x2c, 0x20, 0x36, 0x39, + 0x32, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x33, 0x32, 0x37, 0x2c, 0x20, + 0x36, 0x39, 0x31, 0x2c, 0x20, 0x33, 0x32, 0x36, 0x2c, 0x20, 0x36, 0x39, + 0x30, 0x2c, 0x20, 0x33, 0x32, 0x35, 0x2c, 0x20, 0x36, 0x38, 0x39, 0x2c, + 0x20, 0x33, 0x32, 0x34, 0x2c, 0x20, 0x36, 0x38, 0x38, 0x2c, 0x20, 0x33, + 0x32, 0x33, 0x2c, 0x20, 0x36, 0x38, 0x37, 0x2c, 0x20, 0x33, 0x32, 0x32, + 0x2c, 0x20, 0x36, 0x38, 0x36, 0x2c, 0x20, 0x33, 0x32, 0x31, 0x2c, 0x20, + 0x36, 0x38, 0x35, 0x2c, 0x20, 0x33, 0x32, 0x30, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x36, 0x38, 0x34, 0x2c, 0x20, 0x33, 0x31, 0x39, 0x2c, 0x20, + 0x36, 0x38, 0x33, 0x2c, 0x20, 0x33, 0x31, 0x38, 0x2c, 0x20, 0x36, 0x38, + 0x32, 0x2c, 0x20, 0x33, 0x31, 0x37, 0x2c, 0x20, 0x36, 0x38, 0x31, 0x2c, + 0x20, 0x33, 0x31, 0x36, 0x2c, 0x20, 0x36, 0x38, 0x30, 0x2c, 0x20, 0x33, + 0x31, 0x35, 0x2c, 0x20, 0x36, 0x37, 0x39, 0x2c, 0x20, 0x33, 0x31, 0x34, + 0x2c, 0x20, 0x36, 0x37, 0x38, 0x2c, 0x20, 0x33, 0x31, 0x33, 0x2c, 0x20, + 0x36, 0x37, 0x37, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x33, 0x31, 0x32, + 0x2c, 0x20, 0x36, 0x37, 0x36, 0x2c, 0x20, 0x33, 0x31, 0x31, 0x2c, 0x20, + 0x36, 0x37, 0x35, 0x2c, 0x20, 0x33, 0x31, 0x30, 0x2c, 0x20, 0x36, 0x37, + 0x34, 0x2c, 0x20, 0x33, 0x30, 0x39, 0x2c, 0x20, 0x36, 0x37, 0x33, 0x2c, + 0x20, 0x33, 0x30, 0x38, 0x2c, 0x20, 0x36, 0x37, 0x32, 0x2c, 0x20, 0x33, + 0x30, 0x37, 0x2c, 0x20, 0x36, 0x37, 0x31, 0x2c, 0x20, 0x33, 0x30, 0x36, + 0x2c, 0x20, 0x36, 0x37, 0x30, 0x2c, 0x20, 0x33, 0x30, 0x35, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x36, 0x36, 0x39, 0x2c, 0x20, 0x33, 0x30, 0x34, + 0x2c, 0x20, 0x36, 0x36, 0x38, 0x2c, 0x20, 0x33, 0x30, 0x33, 0x2c, 0x20, + 0x36, 0x36, 0x37, 0x2c, 0x20, 0x33, 0x30, 0x32, 0x2c, 0x20, 0x36, 0x36, + 0x36, 0x2c, 0x20, 0x33, 0x30, 0x31, 0x2c, 0x20, 0x36, 0x36, 0x35, 0x2c, + 0x20, 0x33, 0x30, 0x30, 0x2c, 0x20, 0x36, 0x36, 0x34, 0x2c, 0x20, 0x32, + 0x39, 0x39, 0x2c, 0x20, 0x36, 0x36, 0x33, 0x2c, 0x20, 0x32, 0x39, 0x38, + 0x2c, 0x20, 0x36, 0x36, 0x32, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x32, + 0x39, 0x37, 0x2c, 0x20, 0x36, 0x36, 0x31, 0x2c, 0x20, 0x32, 0x39, 0x36, + 0x2c, 0x20, 0x36, 0x36, 0x30, 0x2c, 0x20, 0x32, 0x39, 0x35, 0x2c, 0x20, + 0x36, 0x35, 0x39, 0x2c, 0x20, 0x32, 0x39, 0x34, 0x2c, 0x20, 0x36, 0x35, + 0x38, 0x2c, 0x20, 0x32, 0x39, 0x33, 0x2c, 0x20, 0x36, 0x35, 0x37, 0x2c, + 0x20, 0x32, 0x39, 0x32, 0x2c, 0x20, 0x36, 0x35, 0x36, 0x2c, 0x20, 0x32, + 0x39, 0x31, 0x2c, 0x20, 0x36, 0x35, 0x35, 0x2c, 0x20, 0x32, 0x39, 0x30, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x36, 0x35, 0x34, 0x2c, 0x20, 0x32, + 0x38, 0x39, 0x2c, 0x20, 0x36, 0x35, 0x33, 0x2c, 0x20, 0x32, 0x38, 0x38, + 0x2c, 0x20, 0x36, 0x35, 0x32, 0x2c, 0x20, 0x32, 0x38, 0x37, 0x2c, 0x20, + 0x36, 0x35, 0x31, 0x2c, 0x20, 0x32, 0x38, 0x36, 0x2c, 0x20, 0x36, 0x35, + 0x30, 0x2c, 0x20, 0x32, 0x38, 0x35, 0x2c, 0x20, 0x36, 0x34, 0x39, 0x2c, + 0x20, 0x32, 0x38, 0x34, 0x2c, 0x20, 0x36, 0x34, 0x38, 0x2c, 0x20, 0x32, + 0x38, 0x33, 0x2c, 0x20, 0x36, 0x34, 0x37, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x32, 0x38, 0x32, 0x2c, 0x20, 0x36, 0x34, 0x36, 0x2c, 0x20, 0x32, + 0x38, 0x31, 0x2c, 0x20, 0x36, 0x34, 0x35, 0x2c, 0x20, 0x32, 0x38, 0x30, + 0x2c, 0x20, 0x36, 0x34, 0x34, 0x2c, 0x20, 0x32, 0x37, 0x39, 0x2c, 0x20, + 0x36, 0x34, 0x33, 0x2c, 0x20, 0x32, 0x37, 0x38, 0x2c, 0x20, 0x36, 0x34, + 0x32, 0x2c, 0x20, 0x32, 0x37, 0x37, 0x2c, 0x20, 0x36, 0x34, 0x31, 0x2c, + 0x20, 0x32, 0x37, 0x36, 0x2c, 0x20, 0x36, 0x34, 0x30, 0x2c, 0x20, 0x32, + 0x37, 0x35, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x36, 0x33, 0x39, 0x2c, + 0x20, 0x32, 0x37, 0x34, 0x2c, 0x20, 0x36, 0x33, 0x38, 0x2c, 0x20, 0x32, + 0x37, 0x33, 0x2c, 0x20, 0x36, 0x33, 0x37, 0x2c, 0x20, 0x32, 0x37, 0x32, + 0x2c, 0x20, 0x36, 0x33, 0x36, 0x2c, 0x20, 0x32, 0x37, 0x31, 0x2c, 0x20, + 0x36, 0x33, 0x35, 0x2c, 0x20, 0x32, 0x37, 0x30, 0x2c, 0x20, 0x36, 0x33, + 0x34, 0x2c, 0x20, 0x32, 0x36, 0x39, 0x2c, 0x20, 0x36, 0x33, 0x33, 0x2c, + 0x20, 0x32, 0x36, 0x38, 0x2c, 0x20, 0x36, 0x33, 0x32, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x32, 0x36, 0x37, 0x2c, 0x20, 0x36, 0x33, 0x31, 0x2c, + 0x20, 0x32, 0x36, 0x36, 0x2c, 0x20, 0x36, 0x33, 0x30, 0x2c, 0x20, 0x32, + 0x36, 0x35, 0x2c, 0x20, 0x36, 0x32, 0x39, 0x2c, 0x20, 0x32, 0x36, 0x34, + 0x2c, 0x20, 0x36, 0x32, 0x38, 0x2c, 0x20, 0x32, 0x36, 0x33, 0x2c, 0x20, + 0x36, 0x32, 0x37, 0x2c, 0x20, 0x32, 0x36, 0x32, 0x2c, 0x20, 0x36, 0x32, + 0x36, 0x2c, 0x20, 0x32, 0x36, 0x31, 0x2c, 0x20, 0x36, 0x32, 0x35, 0x2c, + 0x20, 0x32, 0x36, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x36, 0x32, + 0x34, 0x2c, 0x20, 0x32, 0x35, 0x39, 0x2c, 0x20, 0x36, 0x32, 0x33, 0x2c, + 0x20, 0x32, 0x35, 0x38, 0x2c, 0x20, 0x36, 0x32, 0x32, 0x2c, 0x20, 0x32, + 0x35, 0x37, 0x2c, 0x20, 0x36, 0x32, 0x31, 0x2c, 0x20, 0x32, 0x35, 0x36, + 0x2c, 0x20, 0x36, 0x32, 0x30, 0x2c, 0x20, 0x32, 0x35, 0x35, 0x2c, 0x20, + 0x36, 0x31, 0x39, 0x2c, 0x20, 0x32, 0x35, 0x34, 0x2c, 0x20, 0x36, 0x31, + 0x38, 0x2c, 0x20, 0x32, 0x35, 0x33, 0x2c, 0x20, 0x36, 0x31, 0x37, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x32, 0x35, 0x32, 0x2c, 0x20, 0x36, 0x31, + 0x36, 0x2c, 0x20, 0x32, 0x35, 0x31, 0x2c, 0x20, 0x36, 0x31, 0x35, 0x2c, + 0x20, 0x32, 0x35, 0x30, 0x2c, 0x20, 0x36, 0x31, 0x34, 0x2c, 0x20, 0x32, + 0x34, 0x39, 0x2c, 0x20, 0x36, 0x31, 0x33, 0x2c, 0x20, 0x32, 0x34, 0x38, + 0x2c, 0x20, 0x36, 0x31, 0x32, 0x2c, 0x20, 0x32, 0x34, 0x37, 0x2c, 0x20, + 0x36, 0x31, 0x31, 0x2c, 0x20, 0x32, 0x34, 0x36, 0x2c, 0x20, 0x36, 0x31, + 0x30, 0x2c, 0x20, 0x32, 0x34, 0x35, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x36, 0x30, 0x39, 0x2c, 0x20, 0x32, 0x34, 0x34, 0x2c, 0x20, 0x36, 0x30, + 0x38, 0x2c, 0x20, 0x32, 0x34, 0x33, 0x2c, 0x20, 0x36, 0x30, 0x37, 0x2c, + 0x20, 0x32, 0x34, 0x32, 0x2c, 0x20, 0x36, 0x30, 0x36, 0x2c, 0x20, 0x32, + 0x34, 0x31, 0x2c, 0x20, 0x36, 0x30, 0x35, 0x2c, 0x20, 0x32, 0x34, 0x30, + 0x2c, 0x20, 0x36, 0x30, 0x34, 0x2c, 0x20, 0x32, 0x33, 0x39, 0x2c, 0x20, + 0x36, 0x30, 0x33, 0x2c, 0x20, 0x32, 0x33, 0x38, 0x2c, 0x20, 0x36, 0x30, + 0x32, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x32, 0x33, 0x37, 0x2c, 0x20, + 0x36, 0x30, 0x31, 0x2c, 0x20, 0x32, 0x33, 0x36, 0x2c, 0x20, 0x36, 0x30, + 0x30, 0x2c, 0x20, 0x32, 0x33, 0x35, 0x2c, 0x20, 0x35, 0x39, 0x39, 0x2c, + 0x20, 0x32, 0x33, 0x34, 0x2c, 0x20, 0x35, 0x39, 0x38, 0x2c, 0x20, 0x32, + 0x33, 0x33, 0x2c, 0x20, 0x35, 0x39, 0x37, 0x2c, 0x20, 0x32, 0x33, 0x32, + 0x2c, 0x20, 0x35, 0x39, 0x36, 0x2c, 0x20, 0x32, 0x33, 0x31, 0x2c, 0x20, + 0x35, 0x39, 0x35, 0x2c, 0x20, 0x32, 0x33, 0x30, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x35, 0x39, 0x34, 0x2c, 0x20, 0x32, 0x32, 0x39, 0x2c, 0x20, + 0x35, 0x39, 0x33, 0x2c, 0x20, 0x32, 0x32, 0x38, 0x2c, 0x20, 0x35, 0x39, + 0x32, 0x2c, 0x20, 0x32, 0x32, 0x37, 0x2c, 0x20, 0x35, 0x39, 0x31, 0x2c, + 0x20, 0x32, 0x32, 0x36, 0x2c, 0x20, 0x35, 0x39, 0x30, 0x2c, 0x20, 0x32, + 0x32, 0x35, 0x2c, 0x20, 0x35, 0x38, 0x39, 0x2c, 0x20, 0x32, 0x32, 0x34, + 0x2c, 0x20, 0x35, 0x38, 0x38, 0x2c, 0x20, 0x32, 0x32, 0x33, 0x2c, 0x20, + 0x35, 0x38, 0x37, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x32, 0x32, 0x32, + 0x2c, 0x20, 0x35, 0x38, 0x36, 0x2c, 0x20, 0x32, 0x32, 0x31, 0x2c, 0x20, + 0x35, 0x38, 0x35, 0x2c, 0x20, 0x32, 0x32, 0x30, 0x2c, 0x20, 0x35, 0x38, + 0x34, 0x2c, 0x20, 0x32, 0x31, 0x39, 0x2c, 0x20, 0x35, 0x38, 0x33, 0x2c, + 0x20, 0x32, 0x31, 0x38, 0x2c, 0x20, 0x35, 0x38, 0x32, 0x2c, 0x20, 0x32, + 0x31, 0x37, 0x2c, 0x20, 0x35, 0x38, 0x31, 0x2c, 0x20, 0x32, 0x31, 0x36, + 0x2c, 0x20, 0x35, 0x38, 0x30, 0x2c, 0x20, 0x32, 0x31, 0x35, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x35, 0x37, 0x39, 0x2c, 0x20, 0x32, 0x31, 0x34, + 0x2c, 0x20, 0x35, 0x37, 0x38, 0x2c, 0x20, 0x32, 0x31, 0x33, 0x2c, 0x20, + 0x35, 0x37, 0x37, 0x2c, 0x20, 0x32, 0x31, 0x32, 0x2c, 0x20, 0x35, 0x37, + 0x36, 0x2c, 0x20, 0x32, 0x31, 0x31, 0x2c, 0x20, 0x35, 0x37, 0x35, 0x2c, + 0x20, 0x32, 0x31, 0x30, 0x2c, 0x20, 0x35, 0x37, 0x34, 0x2c, 0x20, 0x32, + 0x30, 0x39, 0x2c, 0x20, 0x35, 0x37, 0x33, 0x2c, 0x20, 0x32, 0x30, 0x38, + 0x2c, 0x20, 0x35, 0x37, 0x32, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x32, + 0x30, 0x37, 0x2c, 0x20, 0x35, 0x37, 0x31, 0x2c, 0x20, 0x32, 0x30, 0x36, + 0x2c, 0x20, 0x35, 0x37, 0x30, 0x2c, 0x20, 0x32, 0x30, 0x35, 0x2c, 0x20, + 0x35, 0x36, 0x39, 0x2c, 0x20, 0x32, 0x30, 0x34, 0x2c, 0x20, 0x35, 0x36, + 0x38, 0x2c, 0x20, 0x32, 0x30, 0x33, 0x2c, 0x20, 0x35, 0x36, 0x37, 0x2c, + 0x20, 0x32, 0x30, 0x32, 0x2c, 0x20, 0x35, 0x36, 0x36, 0x2c, 0x20, 0x32, + 0x30, 0x31, 0x2c, 0x20, 0x35, 0x36, 0x35, 0x2c, 0x20, 0x32, 0x30, 0x30, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x35, 0x36, 0x34, 0x2c, 0x20, 0x31, + 0x39, 0x39, 0x2c, 0x20, 0x35, 0x36, 0x33, 0x2c, 0x20, 0x31, 0x39, 0x38, + 0x2c, 0x20, 0x35, 0x36, 0x32, 0x2c, 0x20, 0x31, 0x39, 0x37, 0x2c, 0x20, + 0x35, 0x36, 0x31, 0x2c, 0x20, 0x31, 0x39, 0x36, 0x2c, 0x20, 0x35, 0x36, + 0x30, 0x2c, 0x20, 0x31, 0x39, 0x35, 0x2c, 0x20, 0x35, 0x35, 0x39, 0x2c, + 0x20, 0x31, 0x39, 0x34, 0x2c, 0x20, 0x35, 0x35, 0x38, 0x2c, 0x20, 0x31, + 0x39, 0x33, 0x2c, 0x20, 0x35, 0x35, 0x37, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x31, 0x39, 0x32, 0x2c, 0x20, 0x35, 0x35, 0x36, 0x2c, 0x20, 0x31, + 0x39, 0x31, 0x2c, 0x20, 0x35, 0x35, 0x35, 0x2c, 0x20, 0x31, 0x39, 0x30, + 0x2c, 0x20, 0x35, 0x35, 0x34, 0x2c, 0x20, 0x31, 0x38, 0x39, 0x2c, 0x20, + 0x35, 0x35, 0x33, 0x2c, 0x20, 0x31, 0x38, 0x38, 0x2c, 0x20, 0x35, 0x35, + 0x32, 0x2c, 0x20, 0x31, 0x38, 0x37, 0x2c, 0x20, 0x35, 0x35, 0x31, 0x2c, + 0x20, 0x31, 0x38, 0x36, 0x2c, 0x20, 0x35, 0x35, 0x30, 0x2c, 0x20, 0x31, + 0x38, 0x35, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x35, 0x34, 0x39, 0x2c, + 0x20, 0x31, 0x38, 0x34, 0x2c, 0x20, 0x35, 0x34, 0x38, 0x2c, 0x20, 0x31, + 0x38, 0x33, 0x2c, 0x20, 0x35, 0x34, 0x37, 0x2c, 0x20, 0x31, 0x38, 0x32, + 0x2c, 0x20, 0x35, 0x34, 0x36, 0x2c, 0x20, 0x31, 0x38, 0x31, 0x2c, 0x20, + 0x35, 0x34, 0x35, 0x2c, 0x20, 0x31, 0x38, 0x30, 0x2c, 0x20, 0x35, 0x34, + 0x34, 0x2c, 0x20, 0x31, 0x37, 0x39, 0x2c, 0x20, 0x35, 0x34, 0x33, 0x2c, + 0x20, 0x31, 0x37, 0x38, 0x2c, 0x20, 0x35, 0x34, 0x32, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x31, 0x37, 0x37, 0x2c, 0x20, 0x35, 0x34, 0x31, 0x2c, + 0x20, 0x31, 0x37, 0x36, 0x2c, 0x20, 0x35, 0x34, 0x30, 0x2c, 0x20, 0x31, + 0x37, 0x35, 0x2c, 0x20, 0x35, 0x33, 0x39, 0x2c, 0x20, 0x31, 0x37, 0x34, + 0x2c, 0x20, 0x35, 0x33, 0x38, 0x2c, 0x20, 0x31, 0x37, 0x33, 0x2c, 0x20, + 0x35, 0x33, 0x37, 0x2c, 0x20, 0x31, 0x37, 0x32, 0x2c, 0x20, 0x35, 0x33, + 0x36, 0x2c, 0x20, 0x31, 0x37, 0x31, 0x2c, 0x20, 0x35, 0x33, 0x35, 0x2c, + 0x20, 0x31, 0x37, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x35, 0x33, + 0x34, 0x2c, 0x20, 0x31, 0x36, 0x39, 0x2c, 0x20, 0x35, 0x33, 0x33, 0x2c, + 0x20, 0x31, 0x36, 0x38, 0x2c, 0x20, 0x35, 0x33, 0x32, 0x2c, 0x20, 0x31, + 0x36, 0x37, 0x2c, 0x20, 0x35, 0x33, 0x31, 0x2c, 0x20, 0x31, 0x36, 0x36, + 0x2c, 0x20, 0x35, 0x33, 0x30, 0x2c, 0x20, 0x31, 0x36, 0x35, 0x2c, 0x20, + 0x35, 0x32, 0x39, 0x2c, 0x20, 0x31, 0x36, 0x34, 0x2c, 0x20, 0x35, 0x32, + 0x38, 0x2c, 0x20, 0x31, 0x36, 0x33, 0x2c, 0x20, 0x35, 0x32, 0x37, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x31, 0x36, 0x32, 0x2c, 0x20, 0x35, 0x32, + 0x36, 0x2c, 0x20, 0x31, 0x36, 0x31, 0x2c, 0x20, 0x35, 0x32, 0x35, 0x2c, + 0x20, 0x31, 0x36, 0x30, 0x2c, 0x20, 0x35, 0x32, 0x34, 0x2c, 0x20, 0x31, + 0x35, 0x39, 0x2c, 0x20, 0x35, 0x32, 0x33, 0x2c, 0x20, 0x31, 0x35, 0x38, + 0x2c, 0x20, 0x35, 0x32, 0x32, 0x2c, 0x20, 0x31, 0x35, 0x37, 0x2c, 0x20, + 0x35, 0x32, 0x31, 0x2c, 0x20, 0x31, 0x35, 0x36, 0x2c, 0x20, 0x35, 0x32, + 0x30, 0x2c, 0x20, 0x31, 0x35, 0x35, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x35, 0x31, 0x39, 0x2c, 0x20, 0x31, 0x35, 0x34, 0x2c, 0x20, 0x35, 0x31, + 0x38, 0x2c, 0x20, 0x31, 0x35, 0x33, 0x2c, 0x20, 0x35, 0x31, 0x37, 0x2c, + 0x20, 0x31, 0x35, 0x32, 0x2c, 0x20, 0x35, 0x31, 0x36, 0x2c, 0x20, 0x31, + 0x35, 0x31, 0x2c, 0x20, 0x35, 0x31, 0x35, 0x2c, 0x20, 0x31, 0x35, 0x30, + 0x2c, 0x20, 0x35, 0x31, 0x34, 0x2c, 0x20, 0x31, 0x34, 0x39, 0x2c, 0x20, + 0x35, 0x31, 0x33, 0x2c, 0x20, 0x31, 0x34, 0x38, 0x2c, 0x20, 0x35, 0x31, + 0x32, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x31, 0x34, 0x37, 0x2c, 0x20, + 0x35, 0x31, 0x31, 0x2c, 0x20, 0x31, 0x34, 0x36, 0x2c, 0x20, 0x35, 0x31, + 0x30, 0x2c, 0x20, 0x31, 0x34, 0x35, 0x2c, 0x20, 0x35, 0x30, 0x39, 0x2c, + 0x20, 0x31, 0x34, 0x34, 0x2c, 0x20, 0x35, 0x30, 0x38, 0x2c, 0x20, 0x31, + 0x34, 0x33, 0x2c, 0x20, 0x35, 0x30, 0x37, 0x2c, 0x20, 0x31, 0x34, 0x32, + 0x2c, 0x20, 0x35, 0x30, 0x36, 0x2c, 0x20, 0x31, 0x34, 0x31, 0x2c, 0x20, + 0x35, 0x30, 0x35, 0x2c, 0x20, 0x31, 0x34, 0x30, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x35, 0x30, 0x34, 0x2c, 0x20, 0x31, 0x33, 0x39, 0x2c, 0x20, + 0x35, 0x30, 0x33, 0x2c, 0x20, 0x31, 0x33, 0x38, 0x2c, 0x20, 0x35, 0x30, + 0x32, 0x2c, 0x20, 0x31, 0x33, 0x37, 0x2c, 0x20, 0x35, 0x30, 0x31, 0x2c, + 0x20, 0x31, 0x33, 0x36, 0x2c, 0x20, 0x35, 0x30, 0x30, 0x2c, 0x20, 0x31, + 0x33, 0x35, 0x2c, 0x20, 0x34, 0x39, 0x39, 0x2c, 0x20, 0x31, 0x33, 0x34, + 0x2c, 0x20, 0x34, 0x39, 0x38, 0x2c, 0x20, 0x31, 0x33, 0x33, 0x2c, 0x20, + 0x34, 0x39, 0x37, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x31, 0x33, 0x32, + 0x2c, 0x20, 0x34, 0x39, 0x36, 0x2c, 0x20, 0x31, 0x33, 0x31, 0x2c, 0x20, + 0x34, 0x39, 0x35, 0x2c, 0x20, 0x31, 0x33, 0x30, 0x2c, 0x20, 0x34, 0x39, + 0x34, 0x2c, 0x20, 0x31, 0x32, 0x39, 0x2c, 0x20, 0x34, 0x39, 0x33, 0x2c, + 0x20, 0x31, 0x32, 0x38, 0x2c, 0x20, 0x34, 0x39, 0x32, 0x2c, 0x20, 0x31, + 0x32, 0x37, 0x2c, 0x20, 0x34, 0x39, 0x31, 0x2c, 0x20, 0x31, 0x32, 0x36, + 0x2c, 0x20, 0x34, 0x39, 0x30, 0x2c, 0x20, 0x31, 0x32, 0x35, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x34, 0x38, 0x39, 0x2c, 0x20, 0x31, 0x32, 0x34, + 0x2c, 0x20, 0x34, 0x38, 0x38, 0x2c, 0x20, 0x31, 0x32, 0x33, 0x2c, 0x20, + 0x34, 0x38, 0x37, 0x2c, 0x20, 0x31, 0x32, 0x32, 0x2c, 0x20, 0x34, 0x38, + 0x36, 0x2c, 0x20, 0x31, 0x32, 0x31, 0x2c, 0x20, 0x34, 0x38, 0x35, 0x2c, + 0x20, 0x31, 0x32, 0x30, 0x2c, 0x20, 0x34, 0x38, 0x34, 0x2c, 0x20, 0x31, + 0x31, 0x39, 0x2c, 0x20, 0x34, 0x38, 0x33, 0x2c, 0x20, 0x31, 0x31, 0x38, + 0x2c, 0x20, 0x34, 0x38, 0x32, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x31, + 0x31, 0x37, 0x2c, 0x20, 0x34, 0x38, 0x31, 0x2c, 0x20, 0x31, 0x31, 0x36, + 0x2c, 0x20, 0x34, 0x38, 0x30, 0x2c, 0x20, 0x31, 0x31, 0x35, 0x2c, 0x20, + 0x34, 0x37, 0x39, 0x2c, 0x20, 0x31, 0x31, 0x34, 0x2c, 0x20, 0x34, 0x37, + 0x38, 0x2c, 0x20, 0x31, 0x31, 0x33, 0x2c, 0x20, 0x34, 0x37, 0x37, 0x2c, + 0x20, 0x31, 0x31, 0x32, 0x2c, 0x20, 0x34, 0x37, 0x36, 0x2c, 0x20, 0x31, + 0x31, 0x31, 0x2c, 0x20, 0x34, 0x37, 0x35, 0x2c, 0x20, 0x31, 0x31, 0x30, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x34, 0x37, 0x34, 0x2c, 0x20, 0x31, + 0x30, 0x39, 0x2c, 0x20, 0x34, 0x37, 0x33, 0x2c, 0x20, 0x31, 0x30, 0x38, + 0x2c, 0x20, 0x34, 0x37, 0x32, 0x2c, 0x20, 0x31, 0x30, 0x37, 0x2c, 0x20, + 0x34, 0x37, 0x31, 0x2c, 0x20, 0x31, 0x30, 0x36, 0x2c, 0x20, 0x34, 0x37, + 0x30, 0x2c, 0x20, 0x31, 0x30, 0x35, 0x2c, 0x20, 0x34, 0x36, 0x39, 0x2c, + 0x20, 0x31, 0x30, 0x34, 0x2c, 0x20, 0x34, 0x36, 0x38, 0x2c, 0x20, 0x31, + 0x30, 0x33, 0x2c, 0x20, 0x34, 0x36, 0x37, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x31, 0x30, 0x32, 0x2c, 0x20, 0x34, 0x36, 0x36, 0x2c, 0x20, 0x31, + 0x30, 0x31, 0x2c, 0x20, 0x34, 0x36, 0x35, 0x2c, 0x20, 0x31, 0x30, 0x30, + 0x2c, 0x20, 0x34, 0x36, 0x34, 0x2c, 0x20, 0x39, 0x39, 0x2c, 0x20, 0x20, + 0x34, 0x36, 0x33, 0x2c, 0x20, 0x39, 0x38, 0x2c, 0x20, 0x20, 0x34, 0x36, + 0x32, 0x2c, 0x20, 0x39, 0x37, 0x2c, 0x20, 0x20, 0x34, 0x36, 0x31, 0x2c, + 0x20, 0x39, 0x36, 0x2c, 0x20, 0x20, 0x34, 0x36, 0x30, 0x2c, 0x20, 0x39, + 0x35, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x34, 0x35, 0x39, 0x2c, 0x20, + 0x39, 0x34, 0x2c, 0x20, 0x20, 0x34, 0x35, 0x38, 0x2c, 0x20, 0x39, 0x33, + 0x2c, 0x20, 0x20, 0x34, 0x35, 0x37, 0x2c, 0x20, 0x39, 0x32, 0x2c, 0x20, + 0x20, 0x34, 0x35, 0x36, 0x2c, 0x20, 0x39, 0x31, 0x2c, 0x20, 0x20, 0x34, + 0x35, 0x35, 0x2c, 0x20, 0x39, 0x30, 0x2c, 0x20, 0x20, 0x34, 0x35, 0x34, + 0x2c, 0x20, 0x38, 0x39, 0x2c, 0x20, 0x20, 0x34, 0x35, 0x33, 0x2c, 0x20, + 0x38, 0x38, 0x2c, 0x20, 0x20, 0x34, 0x35, 0x32, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x38, 0x37, 0x2c, 0x20, 0x20, 0x34, 0x35, 0x31, 0x2c, 0x20, + 0x38, 0x36, 0x2c, 0x20, 0x20, 0x34, 0x35, 0x30, 0x2c, 0x20, 0x38, 0x35, + 0x2c, 0x20, 0x20, 0x34, 0x34, 0x39, 0x2c, 0x20, 0x38, 0x34, 0x2c, 0x20, + 0x20, 0x34, 0x34, 0x38, 0x2c, 0x20, 0x38, 0x33, 0x2c, 0x20, 0x20, 0x34, + 0x34, 0x37, 0x2c, 0x20, 0x38, 0x32, 0x2c, 0x20, 0x20, 0x34, 0x34, 0x36, + 0x2c, 0x20, 0x38, 0x31, 0x2c, 0x20, 0x20, 0x34, 0x34, 0x35, 0x2c, 0x20, + 0x38, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x34, 0x34, 0x34, 0x2c, + 0x20, 0x37, 0x39, 0x2c, 0x20, 0x20, 0x34, 0x34, 0x33, 0x2c, 0x20, 0x37, + 0x38, 0x2c, 0x20, 0x20, 0x34, 0x34, 0x32, 0x2c, 0x20, 0x37, 0x37, 0x2c, + 0x20, 0x20, 0x34, 0x34, 0x31, 0x2c, 0x20, 0x37, 0x36, 0x2c, 0x20, 0x20, + 0x34, 0x34, 0x30, 0x2c, 0x20, 0x37, 0x35, 0x2c, 0x20, 0x20, 0x34, 0x33, + 0x39, 0x2c, 0x20, 0x37, 0x34, 0x2c, 0x20, 0x20, 0x34, 0x33, 0x38, 0x2c, + 0x20, 0x37, 0x33, 0x2c, 0x20, 0x20, 0x34, 0x33, 0x37, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x37, 0x32, 0x2c, 0x20, 0x20, 0x34, 0x33, 0x36, 0x2c, + 0x20, 0x37, 0x31, 0x2c, 0x20, 0x20, 0x34, 0x33, 0x35, 0x2c, 0x20, 0x37, + 0x30, 0x2c, 0x20, 0x20, 0x34, 0x33, 0x34, 0x2c, 0x20, 0x36, 0x39, 0x2c, + 0x20, 0x20, 0x34, 0x33, 0x33, 0x2c, 0x20, 0x36, 0x38, 0x2c, 0x20, 0x20, + 0x34, 0x33, 0x32, 0x2c, 0x20, 0x36, 0x37, 0x2c, 0x20, 0x20, 0x34, 0x33, + 0x31, 0x2c, 0x20, 0x36, 0x36, 0x2c, 0x20, 0x20, 0x34, 0x33, 0x30, 0x2c, + 0x20, 0x36, 0x35, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x34, 0x32, 0x39, + 0x2c, 0x20, 0x36, 0x34, 0x2c, 0x20, 0x20, 0x34, 0x32, 0x38, 0x2c, 0x20, + 0x36, 0x33, 0x2c, 0x20, 0x20, 0x34, 0x32, 0x37, 0x2c, 0x20, 0x36, 0x32, + 0x2c, 0x20, 0x20, 0x34, 0x32, 0x36, 0x2c, 0x20, 0x36, 0x31, 0x2c, 0x20, + 0x20, 0x34, 0x32, 0x35, 0x2c, 0x20, 0x36, 0x30, 0x2c, 0x20, 0x20, 0x34, + 0x32, 0x34, 0x2c, 0x20, 0x35, 0x39, 0x2c, 0x20, 0x20, 0x34, 0x32, 0x33, + 0x2c, 0x20, 0x35, 0x38, 0x2c, 0x20, 0x20, 0x34, 0x32, 0x32, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x35, 0x37, 0x2c, 0x20, 0x20, 0x34, 0x32, 0x31, + 0x2c, 0x20, 0x35, 0x36, 0x2c, 0x20, 0x20, 0x34, 0x32, 0x30, 0x2c, 0x20, + 0x35, 0x35, 0x2c, 0x20, 0x20, 0x34, 0x31, 0x39, 0x2c, 0x20, 0x35, 0x34, + 0x2c, 0x20, 0x20, 0x34, 0x31, 0x38, 0x2c, 0x20, 0x35, 0x33, 0x2c, 0x20, + 0x20, 0x34, 0x31, 0x37, 0x2c, 0x20, 0x35, 0x32, 0x2c, 0x20, 0x20, 0x34, + 0x31, 0x36, 0x2c, 0x20, 0x35, 0x31, 0x2c, 0x20, 0x20, 0x34, 0x31, 0x35, + 0x2c, 0x20, 0x35, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x34, 0x31, + 0x34, 0x2c, 0x20, 0x34, 0x39, 0x2c, 0x20, 0x20, 0x34, 0x31, 0x33, 0x2c, + 0x20, 0x34, 0x38, 0x2c, 0x20, 0x20, 0x34, 0x31, 0x32, 0x2c, 0x20, 0x34, + 0x37, 0x2c, 0x20, 0x20, 0x34, 0x31, 0x31, 0x2c, 0x20, 0x34, 0x36, 0x2c, + 0x20, 0x20, 0x34, 0x31, 0x30, 0x2c, 0x20, 0x34, 0x35, 0x2c, 0x20, 0x20, + 0x34, 0x30, 0x39, 0x2c, 0x20, 0x34, 0x34, 0x2c, 0x20, 0x20, 0x34, 0x30, + 0x38, 0x2c, 0x20, 0x34, 0x33, 0x2c, 0x20, 0x20, 0x34, 0x30, 0x37, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x34, 0x32, 0x2c, 0x20, 0x20, 0x34, 0x30, + 0x36, 0x2c, 0x20, 0x34, 0x31, 0x2c, 0x20, 0x20, 0x34, 0x30, 0x35, 0x2c, + 0x20, 0x34, 0x30, 0x2c, 0x20, 0x20, 0x34, 0x30, 0x34, 0x2c, 0x20, 0x33, + 0x39, 0x2c, 0x20, 0x20, 0x34, 0x30, 0x33, 0x2c, 0x20, 0x33, 0x38, 0x2c, + 0x20, 0x20, 0x34, 0x30, 0x32, 0x2c, 0x20, 0x33, 0x37, 0x2c, 0x20, 0x20, + 0x34, 0x30, 0x31, 0x2c, 0x20, 0x33, 0x36, 0x2c, 0x20, 0x20, 0x34, 0x30, + 0x30, 0x2c, 0x20, 0x33, 0x35, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x33, + 0x39, 0x39, 0x2c, 0x20, 0x33, 0x34, 0x2c, 0x20, 0x20, 0x33, 0x39, 0x38, + 0x2c, 0x20, 0x33, 0x33, 0x2c, 0x20, 0x20, 0x33, 0x39, 0x37, 0x2c, 0x20, + 0x33, 0x32, 0x2c, 0x20, 0x20, 0x33, 0x39, 0x36, 0x2c, 0x20, 0x33, 0x31, + 0x2c, 0x20, 0x20, 0x33, 0x39, 0x35, 0x2c, 0x20, 0x33, 0x30, 0x2c, 0x20, + 0x20, 0x33, 0x39, 0x34, 0x2c, 0x20, 0x32, 0x39, 0x2c, 0x20, 0x20, 0x33, + 0x39, 0x33, 0x2c, 0x20, 0x32, 0x38, 0x2c, 0x20, 0x20, 0x33, 0x39, 0x32, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x32, 0x37, 0x2c, 0x20, 0x20, 0x33, + 0x39, 0x31, 0x2c, 0x20, 0x32, 0x36, 0x2c, 0x20, 0x20, 0x33, 0x39, 0x30, + 0x2c, 0x20, 0x32, 0x35, 0x2c, 0x20, 0x20, 0x33, 0x38, 0x39, 0x2c, 0x20, + 0x32, 0x34, 0x2c, 0x20, 0x20, 0x33, 0x38, 0x38, 0x2c, 0x20, 0x32, 0x33, + 0x2c, 0x20, 0x20, 0x33, 0x38, 0x37, 0x2c, 0x20, 0x32, 0x32, 0x2c, 0x20, + 0x20, 0x33, 0x38, 0x36, 0x2c, 0x20, 0x32, 0x31, 0x2c, 0x20, 0x20, 0x33, + 0x38, 0x35, 0x2c, 0x20, 0x32, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x33, 0x38, 0x34, 0x2c, 0x20, 0x31, 0x39, 0x2c, 0x20, 0x20, 0x33, 0x38, + 0x33, 0x2c, 0x20, 0x31, 0x38, 0x2c, 0x20, 0x20, 0x33, 0x38, 0x32, 0x2c, + 0x20, 0x31, 0x37, 0x2c, 0x20, 0x20, 0x33, 0x38, 0x31, 0x2c, 0x20, 0x31, + 0x36, 0x2c, 0x20, 0x20, 0x33, 0x38, 0x30, 0x2c, 0x20, 0x31, 0x35, 0x2c, + 0x20, 0x20, 0x33, 0x37, 0x39, 0x2c, 0x20, 0x31, 0x34, 0x2c, 0x20, 0x20, + 0x33, 0x37, 0x38, 0x2c, 0x20, 0x31, 0x33, 0x2c, 0x20, 0x20, 0x33, 0x37, + 0x37, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x31, 0x32, 0x2c, 0x20, 0x20, + 0x33, 0x37, 0x36, 0x2c, 0x20, 0x31, 0x31, 0x2c, 0x20, 0x20, 0x33, 0x37, + 0x35, 0x2c, 0x20, 0x31, 0x30, 0x2c, 0x20, 0x20, 0x33, 0x37, 0x34, 0x2c, + 0x20, 0x39, 0x2c, 0x20, 0x20, 0x20, 0x33, 0x37, 0x33, 0x2c, 0x20, 0x38, + 0x2c, 0x20, 0x20, 0x20, 0x33, 0x37, 0x32, 0x2c, 0x20, 0x37, 0x2c, 0x20, + 0x20, 0x20, 0x33, 0x37, 0x31, 0x2c, 0x20, 0x36, 0x2c, 0x20, 0x20, 0x20, + 0x33, 0x37, 0x30, 0x2c, 0x20, 0x35, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x33, 0x36, 0x39, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x20, 0x20, 0x33, 0x36, + 0x38, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x20, 0x20, 0x33, 0x36, 0x37, 0x2c, + 0x20, 0x32, 0x2c, 0x20, 0x20, 0x20, 0x33, 0x36, 0x36, 0x2c, 0x20, 0x31, + 0x2c, 0x20, 0x20, 0x20, 0x33, 0x36, 0x35, 0x2c, 0x20, 0x30, 0x7d, 0x3b, + 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x74, 0x32, 0x20, + 0x3d, 0x20, 0x28, 0x28, 0x6a, 0x25, 0x32, 0x29, 0x2b, 0x31, 0x29, 0x2a, + 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, + 0x2d, 0x20, 0x28, 0x28, 0x6a, 0x29, 0x3e, 0x3e, 0x31, 0x29, 0x3b, 0x0a, + 0x20, 0x2a, 0x2f, 0x0a, 0x0a, 0x74, 0x79, 0x70, 0x65, 0x64, 0x65, 0x66, + 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, + 0x74, 0x5f, 0x74, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x69, + 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x5f, 0x5f, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, + 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x77, + 0x2c, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, + 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, + 0x64, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, + 0x65, 0x5f, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x2c, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x74, 0x6f, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, + 0x20, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x6d, 0x69, 0x64, 0x5f, 0x74, 0x6f, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x28, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, + 0x74, 0x2a, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x77, 0x2c, 0x20, + 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, + 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, 0x64, 0x5f, + 0x68, 0x69, 0x67, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, + 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x77, 0x2c, 0x20, + 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, + 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, + 0x69, 0x64, 0x2c, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x6c, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x6c, 0x5f, 0x74, + 0x72, 0x69, 0x74, 0x73, 0x29, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x5f, 0x5f, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, + 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, + 0x6c, 0x6f, 0x77, 0x2c, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, + 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x69, 0x64, 0x2c, + 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, + 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x6c, 0x5f, + 0x74, 0x72, 0x69, 0x74, 0x73, 0x29, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, + 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x28, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, + 0x74, 0x2a, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x77, + 0x2c, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, + 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x76, 0x6f, 0x6c, 0x61, 0x74, 0x69, + 0x6c, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x2a, 0x20, 0x66, 0x6f, 0x75, + 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x74, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, + 0x6e, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x6d, 0x61, 0x67, + 0x6e, 0x69, 0x74, 0x75, 0x64, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, + 0x74, 0x2a, 0x20, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, + 0x62, 0x65, 0x2c, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x67, 0x72, 0x5f, + 0x69, 0x64, 0x29, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x73, 0x65, + 0x74, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x73, 0x28, 0x5f, 0x5f, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, + 0x2a, 0x20, 0x69, 0x64, 0x2c, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x2a, 0x20, + 0x67, 0x69, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, + 0x2a, 0x20, 0x67, 0x72, 0x5f, 0x69, 0x64, 0x2c, 0x20, 0x5f, 0x5f, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, + 0x74, 0x2a, 0x20, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x2a, 0x20, 0x6e, 0x5f, 0x74, 0x72, + 0x69, 0x74, 0x73, 0x29, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, + 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x5f, 0x5f, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, + 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x6c, 0x6f, + 0x77, 0x2c, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, + 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6d, + 0x69, 0x64, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, + 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x2c, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x74, 0x6f, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x69, 0x3b, 0x0a, 0x20, 0x20, + 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x20, 0x63, 0x61, + 0x72, 0x72, 0x79, 0x20, 0x3d, 0x20, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x62, + 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x20, 0x6c, 0x6f, 0x77, + 0x2c, 0x20, 0x68, 0x69, 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x28, 0x69, 0x20, 0x3d, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x74, 0x6f, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x26, 0x26, 0x20, 0x63, 0x61, 0x72, + 0x72, 0x79, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x2b, 0x2b, + 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x77, 0x20, + 0x3d, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x77, 0x5b, 0x69, 0x5d, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x69, 0x20, 0x3d, 0x20, 0x6d, + 0x69, 0x64, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5b, 0x69, 0x5d, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x77, 0x5b, + 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x68, 0x69, 0x20, 0x5e, 0x20, 0x6c, 0x6f, + 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x68, + 0x69, 0x67, 0x68, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x77, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x72, 0x72, 0x79, 0x20, + 0x3d, 0x20, 0x68, 0x69, 0x20, 0x26, 0x20, 0x28, 0x7e, 0x6c, 0x6f, 0x77, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, 0x76, 0x6f, + 0x69, 0x64, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x6d, 0x69, 0x64, 0x5f, + 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x28, 0x5f, 0x5f, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, + 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x77, + 0x2c, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, + 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, + 0x64, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, + 0x74, 0x2a, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x77, + 0x2c, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, + 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, + 0x74, 0x20, 0x69, 0x64, 0x2c, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x6c, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x6e, + 0x5f, 0x74, 0x72, 0x69, 0x74, 0x73, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x69, 0x2c, 0x20, 0x6a, 0x3b, + 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x20, 0x3d, 0x20, + 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x6e, 0x5f, 0x74, 0x72, 0x69, + 0x74, 0x73, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x69, 0x64, 0x20, 0x2b, 0x20, + 0x69, 0x20, 0x2a, 0x20, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, + 0x77, 0x5b, 0x6a, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x6c, + 0x6f, 0x77, 0x5b, 0x6a, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5b, 0x6a, 0x5d, + 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5b, + 0x6a, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, 0x76, + 0x6f, 0x69, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, + 0x6d, 0x28, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, + 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x77, 0x2c, 0x20, 0x5f, 0x5f, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, + 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x68, + 0x69, 0x67, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, + 0x20, 0x69, 0x64, 0x2c, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x6c, 0x5f, + 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, + 0x74, 0x20, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x73, 0x29, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x2c, 0x20, 0x69, 0x2c, 0x20, 0x6a, 0x2c, 0x20, 0x6b, 0x3b, 0x0a, + 0x20, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, + 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x20, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x2c, 0x20, 0x62, 0x65, 0x74, 0x61, 0x2c, 0x20, 0x67, + 0x61, 0x6d, 0x6d, 0x61, 0x2c, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x2c, + 0x20, 0x73, 0x70, 0x5f, 0x6c, 0x6f, 0x77, 0x5b, 0x33, 0x5d, 0x2c, 0x20, + 0x73, 0x70, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, + 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x72, 0x6f, 0x75, 0x6e, 0x64, + 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x20, + 0x3c, 0x20, 0x4e, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x5f, 0x4f, 0x46, 0x5f, + 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x53, 0x3b, 0x20, 0x72, 0x6f, 0x75, 0x6e, + 0x64, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x28, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, + 0x20, 0x3c, 0x20, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x73, 0x3b, 0x20, + 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x69, 0x64, 0x20, 0x2b, 0x20, 0x69, 0x20, + 0x2a, 0x20, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x6b, 0x20, 0x3d, 0x20, 0x6a, 0x2b, 0x31, 0x3b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, + 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x77, + 0x5b, 0x49, 0x4e, 0x44, 0x45, 0x58, 0x5b, 0x6a, 0x5d, 0x5d, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x65, 0x74, 0x61, 0x20, 0x3d, + 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5b, + 0x49, 0x4e, 0x44, 0x45, 0x58, 0x5b, 0x6a, 0x5d, 0x5d, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x61, 0x6d, 0x6d, 0x61, 0x20, 0x3d, + 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5b, + 0x49, 0x4e, 0x44, 0x45, 0x58, 0x5b, 0x6b, 0x5d, 0x5d, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x3d, + 0x20, 0x28, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x20, 0x7c, 0x20, 0x28, 0x7e, + 0x67, 0x61, 0x6d, 0x6d, 0x61, 0x29, 0x29, 0x20, 0x26, 0x20, 0x28, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x77, 0x5b, 0x49, 0x4e, 0x44, + 0x45, 0x58, 0x5b, 0x6b, 0x5d, 0x5d, 0x20, 0x5e, 0x20, 0x62, 0x65, 0x74, + 0x61, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, + 0x70, 0x5f, 0x6c, 0x6f, 0x77, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x7e, + 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x73, 0x70, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5b, 0x69, 0x5d, 0x20, + 0x3d, 0x20, 0x28, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x20, 0x5e, 0x20, 0x67, + 0x61, 0x6d, 0x6d, 0x61, 0x29, 0x20, 0x7c, 0x20, 0x64, 0x65, 0x6c, 0x74, + 0x61, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x43, 0x4c, 0x4b, + 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x5f, 0x4d, 0x45, 0x4d, 0x5f, 0x46, + 0x45, 0x4e, 0x43, 0x45, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x28, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, + 0x20, 0x3c, 0x20, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x73, 0x3b, 0x20, + 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x69, 0x64, 0x20, 0x2b, 0x20, 0x69, 0x20, + 0x2a, 0x20, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, + 0x77, 0x5b, 0x6a, 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x5f, 0x6c, 0x6f, + 0x77, 0x5b, 0x69, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5b, 0x6a, + 0x5d, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5b, + 0x69, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x43, 0x4c, + 0x4b, 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x5f, 0x4d, 0x45, 0x4d, 0x5f, + 0x46, 0x45, 0x4e, 0x43, 0x45, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, + 0x7d, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x28, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, + 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x77, 0x2c, 0x20, 0x5f, 0x5f, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, + 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x68, + 0x69, 0x67, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x20, 0x76, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6c, 0x65, 0x20, 0x63, 0x68, + 0x61, 0x72, 0x2a, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, + 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x7a, + 0x65, 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, 0x6e, 0x5f, 0x77, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x5f, 0x6d, 0x61, 0x67, 0x6e, 0x69, 0x74, 0x75, 0x64, + 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, + 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6e, 0x6f, + 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x2c, 0x20, 0x5f, + 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, + 0x65, 0x5f, 0x74, 0x20, 0x67, 0x72, 0x5f, 0x69, 0x64, 0x29, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x3b, 0x0a, 0x20, 0x20, + 0x2a, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x65, + 0x20, 0x3d, 0x20, 0x48, 0x49, 0x47, 0x48, 0x5f, 0x42, 0x49, 0x54, 0x53, + 0x3b, 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x20, 0x3d, + 0x20, 0x48, 0x41, 0x53, 0x48, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, + 0x20, 0x2d, 0x20, 0x2a, 0x6d, 0x69, 0x6e, 0x5f, 0x77, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x5f, 0x6d, 0x61, 0x67, 0x6e, 0x69, 0x74, 0x75, 0x64, 0x65, + 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x48, 0x41, 0x53, 0x48, 0x5f, 0x4c, + 0x45, 0x4e, 0x47, 0x54, 0x48, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x6e, 0x6f, 0x6e, 0x63, 0x65, + 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x20, 0x26, 0x3d, 0x20, 0x7e, 0x28, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x77, 0x5b, 0x69, 0x5d, + 0x20, 0x5e, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x68, 0x69, 0x67, + 0x68, 0x5b, 0x69, 0x5d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x2a, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, + 0x6f, 0x62, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3b, 0x0a, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x2a, 0x6e, + 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x20, 0x21, + 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, + 0x2f, 0x2a, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x62, + 0x65, 0x20, 0x3d, 0x20, 0x31, 0x20, 0x3c, 0x3c, 0x20, 0x5f, 0x5f, 0x62, + 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x63, 0x74, 0x7a, 0x6c, 0x28, + 0x2a, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x65, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x66, 0x6f, 0x75, 0x6e, + 0x64, 0x20, 0x3d, 0x20, 0x67, 0x72, 0x5f, 0x69, 0x64, 0x20, 0x2b, 0x20, + 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, 0x76, 0x6f, + 0x69, 0x64, 0x20, 0x73, 0x65, 0x74, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x73, + 0x28, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, + 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x2a, 0x20, 0x69, 0x64, 0x2c, 0x20, 0x5f, + 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, + 0x65, 0x5f, 0x74, 0x2a, 0x20, 0x67, 0x69, 0x64, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, + 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x2a, 0x20, 0x67, 0x72, 0x5f, 0x69, 0x64, + 0x2c, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x2a, 0x20, 0x6c, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x2a, + 0x20, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x73, 0x29, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x6c, 0x5f, 0x72, 0x65, 0x6d, + 0x3b, 0x0a, 0x20, 0x20, 0x2a, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x67, 0x65, + 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, + 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x2a, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x28, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, + 0x2a, 0x67, 0x72, 0x5f, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, + 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x28, 0x30, + 0x29, 0x20, 0x2f, 0x20, 0x2a, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x3b, + 0x0a, 0x20, 0x20, 0x2a, 0x67, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x2a, 0x67, + 0x72, 0x5f, 0x69, 0x64, 0x20, 0x2a, 0x20, 0x53, 0x54, 0x41, 0x54, 0x45, + 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x3b, 0x0a, 0x20, 0x20, 0x6c, + 0x5f, 0x72, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x53, 0x54, 0x41, 0x54, 0x45, + 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, 0x25, 0x20, 0x2a, 0x6c, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x2a, 0x6e, 0x5f, + 0x74, 0x72, 0x69, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, 0x2f, 0x20, 0x2a, + 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x2a, 0x6e, + 0x5f, 0x74, 0x72, 0x69, 0x74, 0x73, 0x20, 0x2b, 0x3d, 0x20, 0x6c, 0x5f, + 0x72, 0x65, 0x6d, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x3f, 0x20, 0x30, + 0x20, 0x3a, 0x20, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x2a, 0x6e, 0x5f, 0x74, + 0x72, 0x69, 0x74, 0x73, 0x20, 0x2d, 0x3d, 0x20, 0x28, 0x2a, 0x6e, 0x5f, + 0x74, 0x72, 0x69, 0x74, 0x73, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x2a, 0x69, + 0x64, 0x29, 0x20, 0x3c, 0x20, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x4c, + 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, 0x3f, 0x20, 0x30, 0x20, 0x3a, 0x20, + 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x5f, 0x5f, 0x6b, 0x65, 0x72, 0x6e, + 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x69, 0x6e, 0x69, 0x74, + 0x28, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x63, 0x68, + 0x61, 0x72, 0x2a, 0x20, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x68, 0x61, 0x73, + 0x68, 0x2c, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, + 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6d, + 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x77, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, + 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6d, + 0x69, 0x64, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x2c, 0x20, 0x5f, 0x5f, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, + 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, + 0x6f, 0x77, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, + 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x5f, 0x68, 0x69, 0x67, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, + 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, 0x6e, + 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x6d, 0x61, 0x67, 0x6e, + 0x69, 0x74, 0x75, 0x64, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x76, + 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6c, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, + 0x2a, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x2c, 0x20, 0x5f, 0x5f, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, + 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x70, + 0x72, 0x6f, 0x62, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x2a, 0x20, 0x6c, 0x6f, 0x6f, 0x70, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, 0x69, + 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x69, 0x2c, 0x20, 0x6a, 0x2c, 0x20, 0x69, + 0x64, 0x2c, 0x20, 0x67, 0x69, 0x64, 0x2c, 0x20, 0x67, 0x72, 0x5f, 0x69, + 0x64, 0x2c, 0x20, 0x67, 0x6c, 0x5f, 0x6f, 0x66, 0x66, 0x2c, 0x20, 0x6c, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x6e, 0x5f, 0x74, 0x72, 0x69, + 0x74, 0x73, 0x3b, 0x0a, 0x20, 0x20, 0x73, 0x65, 0x74, 0x75, 0x70, 0x5f, + 0x69, 0x64, 0x73, 0x28, 0x26, 0x69, 0x64, 0x2c, 0x20, 0x26, 0x67, 0x69, + 0x64, 0x2c, 0x20, 0x26, 0x67, 0x72, 0x5f, 0x69, 0x64, 0x2c, 0x20, 0x26, + 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x26, 0x6e, 0x5f, 0x74, + 0x72, 0x69, 0x74, 0x73, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, + 0x6f, 0x66, 0x66, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, + 0x30, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, + 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, 0x26, 0x26, 0x20, 0x67, 0x72, + 0x5f, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x2a, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x3d, + 0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x69, + 0x66, 0x20, 0x28, 0x67, 0x72, 0x5f, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x20, + 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, + 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x6e, 0x5f, + 0x74, 0x72, 0x69, 0x74, 0x73, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x69, 0x64, + 0x20, 0x2b, 0x20, 0x69, 0x20, 0x2a, 0x20, 0x6c, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x6c, + 0x6f, 0x77, 0x5b, 0x67, 0x69, 0x64, 0x20, 0x2b, 0x20, 0x6a, 0x5d, 0x20, + 0x3d, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x77, 0x5b, 0x6a, 0x5d, + 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x68, 0x69, + 0x67, 0x68, 0x5b, 0x67, 0x69, 0x64, 0x20, 0x2b, 0x20, 0x6a, 0x5d, 0x20, + 0x3d, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5b, 0x6a, + 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x69, 0x66, + 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x20, + 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x67, 0x72, 0x5f, + 0x69, 0x64, 0x20, 0x2b, 0x20, 0x67, 0x6c, 0x5f, 0x6f, 0x66, 0x66, 0x3b, + 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, + 0x26, 0x28, 0x6d, 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x77, 0x5b, 0x67, 0x69, + 0x64, 0x5d, 0x29, 0x2c, 0x20, 0x26, 0x28, 0x6d, 0x69, 0x64, 0x5f, 0x68, + 0x69, 0x67, 0x68, 0x5b, 0x67, 0x69, 0x64, 0x5d, 0x29, 0x2c, 0x20, 0x4e, + 0x4f, 0x4e, 0x43, 0x45, 0x5f, 0x49, 0x4e, 0x49, 0x54, 0x5f, 0x53, 0x54, + 0x41, 0x52, 0x54, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x4f, 0x4e, + 0x43, 0x45, 0x5f, 0x49, 0x4e, 0x43, 0x52, 0x45, 0x4d, 0x45, 0x4e, 0x54, + 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, 0x5f, 0x5f, + 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x28, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x2a, 0x20, 0x74, 0x72, + 0x69, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x2c, 0x20, 0x5f, 0x5f, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, + 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x77, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, + 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, + 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x68, + 0x69, 0x67, 0x68, 0x2c, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, + 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x77, 0x2c, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, + 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x68, + 0x69, 0x67, 0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, + 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, 0x6e, + 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x6d, 0x61, 0x67, 0x6e, + 0x69, 0x74, 0x75, 0x64, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x20, 0x76, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6c, 0x65, 0x20, 0x63, 0x68, + 0x61, 0x72, 0x2a, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x2c, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, + 0x5f, 0x74, 0x2a, 0x20, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, + 0x6f, 0x62, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, + 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x2a, 0x20, 0x6c, 0x6f, 0x6f, + 0x70, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x29, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, 0x73, + 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x69, 0x2c, 0x20, 0x69, 0x64, 0x2c, + 0x20, 0x67, 0x69, 0x64, 0x2c, 0x20, 0x67, 0x72, 0x5f, 0x69, 0x64, 0x2c, + 0x20, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x6e, 0x5f, 0x74, + 0x72, 0x69, 0x74, 0x73, 0x3b, 0x0a, 0x20, 0x20, 0x73, 0x65, 0x74, 0x75, + 0x70, 0x5f, 0x69, 0x64, 0x73, 0x28, 0x26, 0x69, 0x64, 0x2c, 0x20, 0x26, + 0x67, 0x69, 0x64, 0x2c, 0x20, 0x26, 0x67, 0x72, 0x5f, 0x69, 0x64, 0x2c, + 0x20, 0x26, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x26, 0x6e, + 0x5f, 0x74, 0x72, 0x69, 0x74, 0x73, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, + 0x69, 0x20, 0x3c, 0x20, 0x2a, 0x6c, 0x6f, 0x6f, 0x70, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, + 0x3d, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, + 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x26, 0x28, 0x6d, + 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x77, 0x5b, 0x67, 0x69, 0x64, 0x5d, 0x29, + 0x2c, 0x20, 0x26, 0x28, 0x6d, 0x69, 0x64, 0x5f, 0x68, 0x69, 0x67, 0x68, + 0x5b, 0x67, 0x69, 0x64, 0x5d, 0x29, 0x2c, 0x20, 0x4e, 0x4f, 0x4e, 0x43, + 0x45, 0x5f, 0x49, 0x4e, 0x43, 0x52, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x5f, + 0x53, 0x54, 0x41, 0x52, 0x54, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x48, + 0x41, 0x53, 0x48, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x29, 0x3b, + 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, + 0x72, 0x28, 0x43, 0x4c, 0x4b, 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x5f, + 0x4d, 0x45, 0x4d, 0x5f, 0x46, 0x45, 0x4e, 0x43, 0x45, 0x29, 0x3b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x6d, 0x69, 0x64, + 0x5f, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x28, 0x26, 0x28, + 0x6d, 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x77, 0x5b, 0x67, 0x69, 0x64, 0x5d, + 0x29, 0x2c, 0x20, 0x26, 0x28, 0x6d, 0x69, 0x64, 0x5f, 0x68, 0x69, 0x67, + 0x68, 0x5b, 0x67, 0x69, 0x64, 0x5d, 0x29, 0x2c, 0x20, 0x26, 0x28, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x77, 0x5b, 0x67, 0x69, 0x64, + 0x5d, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x26, 0x28, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x68, 0x69, + 0x67, 0x68, 0x5b, 0x67, 0x69, 0x64, 0x5d, 0x29, 0x2c, 0x20, 0x69, 0x64, + 0x2c, 0x20, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x6e, 0x5f, + 0x74, 0x72, 0x69, 0x74, 0x73, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x43, 0x4c, 0x4b, + 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x5f, 0x4d, 0x45, 0x4d, 0x5f, 0x46, + 0x45, 0x4e, 0x43, 0x45, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x26, 0x28, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x77, 0x5b, 0x67, 0x69, 0x64, + 0x5d, 0x29, 0x2c, 0x20, 0x26, 0x28, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, + 0x68, 0x69, 0x67, 0x68, 0x5b, 0x67, 0x69, 0x64, 0x5d, 0x29, 0x2c, 0x20, + 0x69, 0x64, 0x2c, 0x20, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, + 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x73, 0x29, 0x3b, 0x0a, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x43, + 0x4c, 0x4b, 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x5f, 0x4d, 0x45, 0x4d, + 0x5f, 0x46, 0x45, 0x4e, 0x43, 0x45, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x30, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x28, 0x26, 0x28, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, + 0x77, 0x5b, 0x67, 0x69, 0x64, 0x5d, 0x29, 0x2c, 0x20, 0x26, 0x28, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5b, 0x67, 0x69, + 0x64, 0x5d, 0x29, 0x2c, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x2c, 0x20, + 0x6d, 0x69, 0x6e, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x6d, + 0x61, 0x67, 0x6e, 0x69, 0x74, 0x75, 0x64, 0x65, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x26, 0x28, + 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x5b, + 0x67, 0x72, 0x5f, 0x69, 0x64, 0x5d, 0x29, 0x2c, 0x20, 0x67, 0x72, 0x5f, + 0x69, 0x64, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, + 0x72, 0x72, 0x69, 0x65, 0x72, 0x28, 0x43, 0x4c, 0x4b, 0x5f, 0x4c, 0x4f, + 0x43, 0x41, 0x4c, 0x5f, 0x4d, 0x45, 0x4d, 0x5f, 0x46, 0x45, 0x4e, 0x43, + 0x45, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, + 0x2a, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, + 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, 0x5f, 0x5f, 0x6b, + 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x66, + 0x69, 0x6e, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x5f, 0x5f, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x63, 0x68, 0x61, 0x72, 0x2a, 0x20, 0x74, + 0x72, 0x69, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x2c, 0x20, 0x5f, 0x5f, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, + 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, 0x64, 0x5f, 0x6c, 0x6f, + 0x77, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, + 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, + 0x64, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x2c, 0x20, 0x5f, 0x5f, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, + 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x6f, + 0x77, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x62, + 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, 0x74, 0x2a, 0x20, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x63, + 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x7a, 0x65, + 0x5f, 0x74, 0x2a, 0x20, 0x6d, 0x69, 0x6e, 0x5f, 0x77, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x5f, 0x6d, 0x61, 0x67, 0x6e, 0x69, 0x74, 0x75, 0x64, 0x65, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x76, 0x6f, + 0x6c, 0x61, 0x74, 0x69, 0x6c, 0x65, 0x20, 0x63, 0x68, 0x61, 0x72, 0x2a, + 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x20, 0x62, 0x63, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x5f, + 0x74, 0x2a, 0x20, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, + 0x62, 0x65, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x74, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x2a, 0x20, 0x6c, 0x6f, + 0x6f, 0x70, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x29, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x5f, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x20, + 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, 0x20, 0x69, 0x2c, 0x20, 0x6a, 0x2c, + 0x20, 0x69, 0x64, 0x2c, 0x20, 0x67, 0x69, 0x64, 0x2c, 0x20, 0x67, 0x72, + 0x5f, 0x69, 0x64, 0x2c, 0x20, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, + 0x20, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x73, 0x3b, 0x0a, 0x20, 0x20, + 0x73, 0x65, 0x74, 0x75, 0x70, 0x5f, 0x69, 0x64, 0x73, 0x28, 0x26, 0x69, + 0x64, 0x2c, 0x20, 0x26, 0x67, 0x69, 0x64, 0x2c, 0x20, 0x26, 0x67, 0x72, + 0x5f, 0x69, 0x64, 0x2c, 0x20, 0x26, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x2c, 0x20, 0x26, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x73, 0x29, 0x3b, + 0x0a, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x67, 0x72, 0x5f, 0x69, + 0x64, 0x20, 0x3d, 0x3d, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x74, + 0x29, 0x28, 0x2a, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x2d, 0x20, 0x31, + 0x29, 0x20, 0x26, 0x26, 0x20, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x70, + 0x72, 0x6f, 0x62, 0x65, 0x5b, 0x67, 0x72, 0x5f, 0x69, 0x64, 0x5d, 0x20, + 0x21, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x28, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, + 0x69, 0x20, 0x3c, 0x20, 0x6e, 0x5f, 0x74, 0x72, 0x69, 0x74, 0x73, 0x3b, + 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x6a, 0x20, 0x3d, 0x20, 0x69, 0x64, 0x20, 0x2b, 0x20, 0x69, + 0x20, 0x2a, 0x20, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x3b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6a, 0x20, 0x3c, + 0x20, 0x48, 0x41, 0x53, 0x48, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, + 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x74, 0x72, 0x69, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x5b, 0x6a, 0x5d, + 0x20, 0x3d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x28, 0x6d, 0x69, 0x64, 0x5f, 0x6c, 0x6f, 0x77, 0x5b, + 0x67, 0x69, 0x64, 0x20, 0x2b, 0x20, 0x6a, 0x5d, 0x20, 0x26, 0x20, 0x6e, + 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x5b, 0x67, + 0x72, 0x5f, 0x69, 0x64, 0x5d, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3f, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3a, 0x20, 0x28, 0x6d, 0x69, 0x64, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x5b, + 0x67, 0x69, 0x64, 0x20, 0x2b, 0x20, 0x6a, 0x5d, 0x20, 0x26, 0x20, 0x6e, + 0x6f, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x65, 0x5b, 0x67, + 0x72, 0x5f, 0x69, 0x64, 0x5d, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x20, + 0x3f, 0x20, 0x2d, 0x31, 0x20, 0x3a, 0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a}; unsigned int pearl_cl_len = 11514; diff --git a/src/pow_cl.c b/src/pow_cl.c index 48b7b79..209e2a2 100644 --- a/src/pow_cl.c +++ b/src/pow_cl.c @@ -1,16 +1,16 @@ #include "pow_cl.h" -#include "clcontext.h" #include +#include +#include +#include #include "./hash/curl.h" +#include "clcontext.h" #include "constants.h" -#include -#include -#include -#define HASH_LENGTH 243 //trits -#define NONCE_LENGTH 81 //trits -#define STATE_LENGTH 3 * HASH_LENGTH //trits -#define TRANSACTION_LENGTH 2673 * 3 +#define HASH_LENGTH 243 // trits +#define NONCE_LENGTH 81 // trits +#define STATE_LENGTH 3 * HASH_LENGTH // trits +#define TRANSACTION_LENGTH 2673 * 3 #define HIGH_BITS 0xFFFFFFFFFFFFFFFF #define LOW_BITS 0x0000000000000000 #define LOW_0 0xDB6DB6DB6DB6DB6D @@ -26,52 +26,72 @@ CLContext **pow_ctx; static void init_BufferInfo(CLContext *ctx) { - ctx->kernel_info.buffer_info[0] = (BufferInfo){sizeof(char) * HASH_LENGTH, CL_MEM_WRITE_ONLY}; - ctx->kernel_info.buffer_info[1] = (BufferInfo){sizeof(int64_t) * STATE_LENGTH, CL_MEM_READ_WRITE, 2}; - ctx->kernel_info.buffer_info[2] = (BufferInfo){sizeof(int64_t) * STATE_LENGTH, CL_MEM_READ_WRITE, 2}; - ctx->kernel_info.buffer_info[3] = (BufferInfo){sizeof(int64_t) * STATE_LENGTH, CL_MEM_READ_WRITE, 2}; - ctx->kernel_info.buffer_info[4] = (BufferInfo){sizeof(int64_t) * STATE_LENGTH, CL_MEM_READ_WRITE, 2}; - ctx->kernel_info.buffer_info[5] = (BufferInfo){sizeof(size_t), CL_MEM_READ_ONLY}; - ctx->kernel_info.buffer_info[6] = (BufferInfo){sizeof(char), CL_MEM_READ_WRITE}; - ctx->kernel_info.buffer_info[7] = (BufferInfo){sizeof(int64_t), CL_MEM_READ_WRITE, 2}; - ctx->kernel_info.buffer_info[8] = (BufferInfo){sizeof(size_t), CL_MEM_READ_ONLY}; + ctx->kernel_info.buffer_info[0] = + (BufferInfo){sizeof(char) * HASH_LENGTH, CL_MEM_WRITE_ONLY}; + ctx->kernel_info.buffer_info[1] = + (BufferInfo){sizeof(int64_t) * STATE_LENGTH, CL_MEM_READ_WRITE, 2}; + ctx->kernel_info.buffer_info[2] = + (BufferInfo){sizeof(int64_t) * STATE_LENGTH, CL_MEM_READ_WRITE, 2}; + ctx->kernel_info.buffer_info[3] = + (BufferInfo){sizeof(int64_t) * STATE_LENGTH, CL_MEM_READ_WRITE, 2}; + ctx->kernel_info.buffer_info[4] = + (BufferInfo){sizeof(int64_t) * STATE_LENGTH, CL_MEM_READ_WRITE, 2}; + ctx->kernel_info.buffer_info[5] = + (BufferInfo){sizeof(size_t), CL_MEM_READ_ONLY}; + ctx->kernel_info.buffer_info[6] = + (BufferInfo){sizeof(char), CL_MEM_READ_WRITE}; + ctx->kernel_info.buffer_info[7] = + (BufferInfo){sizeof(int64_t), CL_MEM_READ_WRITE, 2}; + ctx->kernel_info.buffer_info[8] = + (BufferInfo){sizeof(size_t), CL_MEM_READ_ONLY}; init_cl_buffer(ctx); } -static void write_cl_buffer(CLContext *ctx, int64_t *mid_low, int64_t *mid_high, int mwm, int loop_count) +static void write_cl_buffer(CLContext *ctx, + int64_t *mid_low, + int64_t *mid_high, + int mwm, + int loop_count) { cl_command_queue cmdq = ctx->cmdq; cl_mem *memobj = ctx->buffer; BufferInfo *buffer_info = ctx->kernel_info.buffer_info; - clEnqueueWriteBuffer(cmdq, memobj[1], CL_TRUE, 0, buffer_info[1].size, mid_low, 0, NULL, NULL); - clEnqueueWriteBuffer(cmdq, memobj[2], CL_TRUE, 0, buffer_info[2].size, mid_high, 0, NULL, NULL); - clEnqueueWriteBuffer(cmdq, memobj[5], CL_TRUE, 0, buffer_info[5].size, &mwm, 0, NULL, NULL); - clEnqueueWriteBuffer(cmdq, memobj[8], CL_TRUE, 0, buffer_info[8].size, &loop_count, 0, NULL, NULL); + clEnqueueWriteBuffer(cmdq, memobj[1], CL_TRUE, 0, buffer_info[1].size, + mid_low, 0, NULL, NULL); + clEnqueueWriteBuffer(cmdq, memobj[2], CL_TRUE, 0, buffer_info[2].size, + mid_high, 0, NULL, NULL); + clEnqueueWriteBuffer(cmdq, memobj[5], CL_TRUE, 0, buffer_info[5].size, &mwm, + 0, NULL, NULL); + clEnqueueWriteBuffer(cmdq, memobj[8], CL_TRUE, 0, buffer_info[8].size, + &loop_count, 0, NULL, NULL); } -static void init_state(char *state, int64_t *mid_low, int64_t *mid_high, size_t offset) +static void init_state(char *state, + int64_t *mid_low, + int64_t *mid_high, + size_t offset) { for (int i = 0; i < STATE_LENGTH; i++) { switch (state[i]) { - case 0: - mid_low[i] = HIGH_BITS; - mid_high[i] = HIGH_BITS; - break; - case 1: - mid_low[i] = LOW_BITS; - mid_high[i] = HIGH_BITS; - break; - default: - mid_low[i] = HIGH_BITS; - mid_high[i] = LOW_BITS; + case 0: + mid_low[i] = HIGH_BITS; + mid_high[i] = HIGH_BITS; + break; + case 1: + mid_low[i] = LOW_BITS; + mid_high[i] = HIGH_BITS; + break; + default: + mid_low[i] = HIGH_BITS; + mid_high[i] = LOW_BITS; } } mid_low[offset] = LOW_0; mid_high[offset] = HIGH_0; mid_low[offset + 1] = LOW_1; - mid_high[offset + 1] = HIGH_1; + mid_high[offset + 1] = HIGH_1; mid_low[offset + 2] = LOW_2; mid_high[offset + 2] = HIGH_2; mid_low[offset + 3] = LOW_3; @@ -81,7 +101,7 @@ static void init_state(char *state, int64_t *mid_low, int64_t *mid_high, size_t void pwork_ctx_init(int context_size) { char *kernel_name[] = {"init", "search", "finalize"}; - + pow_ctx = (CLContext **) malloc(sizeof(CLContext *) * context_size); printf("Initializing OpenCL context ...\n"); @@ -120,25 +140,32 @@ static char *pwork(char *state, int mwm, int index) } global_work_size = local_work_size * num_groups; - + int64_t mid_low[STATE_LENGTH] = {0}, mid_high[STATE_LENGTH] = {0}; init_state(state, mid_low, mid_high, HASH_LENGTH - NONCE_LENGTH); - + write_cl_buffer(titan, mid_low, mid_high, mwm, 32); - if (CL_SUCCESS == clEnqueueNDRangeKernel(titan->cmdq, titan->kernel[0], 1, &global_offset, &global_work_size, &local_work_size, 0, NULL, &ev)) { + if (CL_SUCCESS == clEnqueueNDRangeKernel(titan->cmdq, titan->kernel[0], 1, + &global_offset, &global_work_size, + &local_work_size, 0, NULL, &ev)) { clWaitForEvents(1, &ev); clReleaseEvent(ev); while (found == 0) { - if (CL_SUCCESS != clEnqueueNDRangeKernel(titan->cmdq, titan->kernel[1], 1, NULL, &global_work_size, &local_work_size, 0, NULL, &ev1)) { + if (CL_SUCCESS != + clEnqueueNDRangeKernel(titan->cmdq, titan->kernel[1], 1, NULL, + &global_work_size, &local_work_size, 0, + NULL, &ev1)) { clReleaseEvent(ev1); printf("running search kernel failed\n"); exit(0); } clWaitForEvents(1, &ev1); clReleaseEvent(ev1); - if (CL_SUCCESS != clEnqueueReadBuffer(titan->cmdq, titan->buffer[6], CL_TRUE, 0, sizeof(char), &found, 0, NULL, NULL)) { + if (CL_SUCCESS != clEnqueueReadBuffer(titan->cmdq, titan->buffer[6], + CL_TRUE, 0, sizeof(char), + &found, 0, NULL, NULL)) { printf("Reading finished bool failed\n"); exit(0); } @@ -148,7 +175,9 @@ static char *pwork(char *state, int mwm, int index) exit(0); } - if (CL_SUCCESS != clEnqueueNDRangeKernel(titan->cmdq, titan->kernel[2], 1, NULL, &global_work_size, &local_work_size, 0, NULL, &ev)) { + if (CL_SUCCESS != clEnqueueNDRangeKernel(titan->cmdq, titan->kernel[2], 1, + NULL, &global_work_size, + &local_work_size, 0, NULL, &ev)) { printf("Running finalize kernel failed\n"); exit(0); } @@ -156,7 +185,9 @@ static char *pwork(char *state, int mwm, int index) char *buf = malloc(HASH_LENGTH); if (found > 0) { - if (CL_SUCCESS != clEnqueueReadBuffer(titan->cmdq, titan->buffer[0], CL_TRUE, 0, HASH_LENGTH * sizeof(char), buf, 1, &ev, NULL)) { + if (CL_SUCCESS != clEnqueueReadBuffer( + titan->cmdq, titan->buffer[0], CL_TRUE, 0, + HASH_LENGTH * sizeof(char), buf, 1, &ev, NULL)) { printf("Reading buf failed\n"); exit(0); } @@ -172,19 +203,22 @@ static char *tx_to_cstate(Trytes_t *tx) /* Copy tx->data[:(transactionTrinarySize - HashSize) / 3] to tyt */ memcpy(tyt, tx->data, (transactionTrinarySize - HashSize) / 3); - + Trytes_t *inn = initTrytes(tyt, (transactionTrinarySize - HashSize) / 3); - + Absorb(c, inn); Trits_t *tr = trits_from_trytes(tx); char *c_state = (char *) malloc(c->state->len); - + /* Prepare an array storing tr[transactionTrinarySize - HashSize:] */ - memcpy(c_state, tr->data + transactionTrinarySize - HashSize, tr->len - (transactionTrinarySize - HashSize)); - memcpy(c_state + tr->len - (transactionTrinarySize - HashSize), c->state->data + tr->len - (transactionTrinarySize - HashSize), c->state->len - tr->len + (transactionTrinarySize - HashSize)); - + memcpy(c_state, tr->data + transactionTrinarySize - HashSize, + tr->len - (transactionTrinarySize - HashSize)); + memcpy(c_state + tr->len - (transactionTrinarySize - HashSize), + c->state->data + tr->len - (transactionTrinarySize - HashSize), + c->state->len - tr->len + (transactionTrinarySize - HashSize)); + freeTrobject(inn); freeTrobject(tr); freeCurl(c); @@ -194,22 +228,23 @@ static char *tx_to_cstate(Trytes_t *tx) Trytes_t *PowCL(Trytes_t *trytes, int mwm, int index) { - //Trytes_t *trytes_t = initTrytes(trytes, 2673); + // Trytes_t *trytes_t = initTrytes(trytes, 2673); Trytes_t *trytes_t = trytes; Trits_t *tr = trits_from_trytes(trytes_t); - char *c_state = tx_to_cstate(trytes_t); - - char *ret = pwork(c_state, mwm, index); - - memcpy(&tr->data[TRANSACTION_LENGTH - HASH_LENGTH], ret, HASH_LENGTH * sizeof(char)); - + char *c_state = tx_to_cstate(trytes_t); + + char *ret = pwork(c_state, mwm, index); + + memcpy(&tr->data[TRANSACTION_LENGTH - HASH_LENGTH], ret, + HASH_LENGTH * sizeof(char)); + Trytes_t *last = trytes_from_trits(tr); freeTrobject(tr); free(c_state); free(ret); - - return last; + + return last; } diff --git a/src/pow_sse.c b/src/pow_sse.c index c7db6ef..5d0ca89 100644 --- a/src/pow_sse.c +++ b/src/pow_sse.c @@ -26,10 +26,10 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include "pow_sse.h" +#include #include #include -#include -#include "pow_sse.h" #include "./hash/curl.h" #include "constants.h" @@ -39,14 +39,15 @@ #endif /* On Mac OS X, define our own get_nprocs_conf() */ -#if defined (__APPLE__) || defined(__FreeBSD__) +#if defined(__APPLE__) || defined(__FreeBSD__) #include unsigned int get_nprocs_conf() { - int numProcessors = 0; - size_t size = sizeof(numProcessors); - if (sysctlbyname("hw.ncpu", &numProcessors, &size, NULL, 0)) return 1; - return (unsigned int) numProcessors; + int numProcessors = 0; + size_t size = sizeof(numProcessors); + if (sysctlbyname("hw.ncpu", &numProcessors, &size, NULL, 0)) + return 1; + return (unsigned int) numProcessors; } #define NPROCS #endif @@ -56,110 +57,163 @@ int *stopSSE; long long int *countSSE; int DCURL_NUM_CPU = 0; -const int indices[] = {0, 364, 728, 363, 727, 362, 726, 361, 725, 360, 724, 359, 723, 358, 722, 357, 721, 356, 720, 355, 719, 354, 718, 353, 717, 352, 716, 351, 715, 350, 714, 349, 713, 348, 712, 347, 711, 346, 710, 345, 709, 344, 708, 343, 707, 342, 706, 341, 705, 340, 704, 339, 703, 338, 702, 337, 701, 336, 700, 335, 699, 334, 698, 333, 697, 332, 696, 331, 695, 330, 694, 329, 693, 328, 692, 327, 691, 326, 690, 325, 689, 324, 688, 323, 687, 322, 686, 321, 685, 320, 684, 319, 683, 318, 682, 317, 681, 316, 680, 315, 679, 314, 678, 313, 677, 312, 676, 311, 675, 310, 674, 309, 673, 308, 672, 307, 671, 306, 670, 305, 669, 304, 668, 303, 667, 302, 666, 301, 665, 300, 664, 299, 663, 298, 662, 297, 661, 296, 660, 295, 659, 294, 658, 293, 657, 292, 656, 291, 655, 290, 654, 289, 653, 288, 652, 287, 651, 286, 650, 285, 649, 284, 648, 283, 647, 282, 646, 281, 645, 280, 644, 279, 643, 278, 642, 277, 641, 276, 640, 275, 639, 274, 638, 273, 637, 272, 636, 271, 635, 270, 634, 269, 633, 268, 632, 267, 631, 266, 630, 265, 629, 264, 628, 263, 627, 262, 626, 261, 625, 260, 624, 259, 623, 258, 622, 257, 621, 256, 620, 255, 619, 254, 618, 253, 617, 252, 616, 251, 615, 250, 614, 249, 613, 248, 612, 247, 611, 246, 610, 245, 609, 244, 608, 243, 607, 242, 606, 241, 605, 240, 604, 239, 603, 238, 602, 237, 601, 236, 600, 235, 599, 234, 598, 233, 597, 232, 596, 231, 595, 230, 594, 229, 593, 228, 592, 227, 591, 226, 590, 225, 589, 224, 588, 223, 587, 222, 586, 221, 585, 220, 584, 219, 583, 218, 582, 217, 581, 216, 580, 215, 579, 214, 578, 213, 577, 212, 576, 211, 575, 210, 574, 209, 573, 208, 572, 207, 571, 206, 570, 205, 569, 204, 568, 203, 567, 202, 566, 201, 565, 200, 564, 199, 563, 198, 562, 197, 561, 196, 560, 195, 559, 194, 558, 193, 557, 192, 556, 191, 555, 190, 554, 189, 553, 188, 552, 187, 551, 186, 550, 185, 549, 184, 548, 183, 547, 182, 546, 181, 545, 180, 544, 179, 543, 178, 542, 177, 541, 176, 540, 175, 539, 174, 538, 173, 537, 172, 536, 171, 535, 170, 534, 169, 533, 168, 532, 167, 531, 166, 530, 165, 529, 164, 528, 163, 527, 162, 526, 161, 525, 160, 524, 159, 523, 158, 522, 157, 521, 156, 520, 155, 519, 154, 518, 153, 517, 152, 516, 151, 515, 150, 514, 149, 513, 148, 512, 147, 511, 146, 510, 145, 509, 144, 508, 143, 507, 142, 506, 141, 505, 140, 504, 139, 503, 138, 502, 137, 501, 136, 500, 135, 499, 134, 498, 133, 497, 132, 496, 131, 495, 130, 494, 129, 493, 128, 492, 127, 491, 126, 490, 125, 489, 124, 488, 123, 487, 122, 486, 121, 485, 120, 484, 119, 483, 118, 482, 117, 481, 116, 480, 115, 479, 114, 478, 113, 477, 112, 476, 111, 475, 110, 474, 109, 473, 108, 472, 107, 471, 106, 470, 105, 469, 104, 468, 103, 467, 102, 466, 101, 465, 100, 464, 99, 463, 98, 462, 97, 461, 96, 460, 95, 459, 94, 458, 93, 457, 92, 456, 91, 455, 90, 454, 89, 453, 88, 452, 87, 451, 86, 450, 85, 449, 84, 448, 83, 447, 82, 446, 81, 445, 80, 444, 79, 443, 78, 442, 77, 441, 76, 440, 75, 439, 74, 438, 73, 437, 72, 436, 71, 435, 70, 434, 69, 433, 68, 432, 67, 431, 66, 430, 65, 429, 64, 428, 63, 427, 62, 426, 61, 425, 60, 424, 59, 423, 58, 422, 57, 421, 56, 420, 55, 419, 54, 418, 53, 417, 52, 416, 51, 415, 50, 414, 49, 413, 48, 412, 47, 411, 46, 410, 45, 409, 44, 408, 43, 407, 42, 406, 41, 405, 40, 404, 39, 403, 38, 402, 37, 401, 36, 400, 35, 399, 34, 398, 33, 397, 32, 396, 31, 395, 30, 394, 29, 393, 28, 392, 27, 391, 26, 390, 25, 389, 24, 388, 23, 387, 22, 386, 21, 385, 20, 384, 19, 383, 18, 382, 17, 381, 16, 380, 15, 379, 14, 378, 13, 377, 12, 376, 11, 375, 10, 374, 9, 373, 8, 372, 7, 371, 6, 370, 5, 369, 4, 368, 3, 367, 2, 366, 1, 365, 0}; +const int indices[] = { + 0, 364, 728, 363, 727, 362, 726, 361, 725, 360, 724, 359, 723, 358, 722, + 357, 721, 356, 720, 355, 719, 354, 718, 353, 717, 352, 716, 351, 715, 350, + 714, 349, 713, 348, 712, 347, 711, 346, 710, 345, 709, 344, 708, 343, 707, + 342, 706, 341, 705, 340, 704, 339, 703, 338, 702, 337, 701, 336, 700, 335, + 699, 334, 698, 333, 697, 332, 696, 331, 695, 330, 694, 329, 693, 328, 692, + 327, 691, 326, 690, 325, 689, 324, 688, 323, 687, 322, 686, 321, 685, 320, + 684, 319, 683, 318, 682, 317, 681, 316, 680, 315, 679, 314, 678, 313, 677, + 312, 676, 311, 675, 310, 674, 309, 673, 308, 672, 307, 671, 306, 670, 305, + 669, 304, 668, 303, 667, 302, 666, 301, 665, 300, 664, 299, 663, 298, 662, + 297, 661, 296, 660, 295, 659, 294, 658, 293, 657, 292, 656, 291, 655, 290, + 654, 289, 653, 288, 652, 287, 651, 286, 650, 285, 649, 284, 648, 283, 647, + 282, 646, 281, 645, 280, 644, 279, 643, 278, 642, 277, 641, 276, 640, 275, + 639, 274, 638, 273, 637, 272, 636, 271, 635, 270, 634, 269, 633, 268, 632, + 267, 631, 266, 630, 265, 629, 264, 628, 263, 627, 262, 626, 261, 625, 260, + 624, 259, 623, 258, 622, 257, 621, 256, 620, 255, 619, 254, 618, 253, 617, + 252, 616, 251, 615, 250, 614, 249, 613, 248, 612, 247, 611, 246, 610, 245, + 609, 244, 608, 243, 607, 242, 606, 241, 605, 240, 604, 239, 603, 238, 602, + 237, 601, 236, 600, 235, 599, 234, 598, 233, 597, 232, 596, 231, 595, 230, + 594, 229, 593, 228, 592, 227, 591, 226, 590, 225, 589, 224, 588, 223, 587, + 222, 586, 221, 585, 220, 584, 219, 583, 218, 582, 217, 581, 216, 580, 215, + 579, 214, 578, 213, 577, 212, 576, 211, 575, 210, 574, 209, 573, 208, 572, + 207, 571, 206, 570, 205, 569, 204, 568, 203, 567, 202, 566, 201, 565, 200, + 564, 199, 563, 198, 562, 197, 561, 196, 560, 195, 559, 194, 558, 193, 557, + 192, 556, 191, 555, 190, 554, 189, 553, 188, 552, 187, 551, 186, 550, 185, + 549, 184, 548, 183, 547, 182, 546, 181, 545, 180, 544, 179, 543, 178, 542, + 177, 541, 176, 540, 175, 539, 174, 538, 173, 537, 172, 536, 171, 535, 170, + 534, 169, 533, 168, 532, 167, 531, 166, 530, 165, 529, 164, 528, 163, 527, + 162, 526, 161, 525, 160, 524, 159, 523, 158, 522, 157, 521, 156, 520, 155, + 519, 154, 518, 153, 517, 152, 516, 151, 515, 150, 514, 149, 513, 148, 512, + 147, 511, 146, 510, 145, 509, 144, 508, 143, 507, 142, 506, 141, 505, 140, + 504, 139, 503, 138, 502, 137, 501, 136, 500, 135, 499, 134, 498, 133, 497, + 132, 496, 131, 495, 130, 494, 129, 493, 128, 492, 127, 491, 126, 490, 125, + 489, 124, 488, 123, 487, 122, 486, 121, 485, 120, 484, 119, 483, 118, 482, + 117, 481, 116, 480, 115, 479, 114, 478, 113, 477, 112, 476, 111, 475, 110, + 474, 109, 473, 108, 472, 107, 471, 106, 470, 105, 469, 104, 468, 103, 467, + 102, 466, 101, 465, 100, 464, 99, 463, 98, 462, 97, 461, 96, 460, 95, + 459, 94, 458, 93, 457, 92, 456, 91, 455, 90, 454, 89, 453, 88, 452, + 87, 451, 86, 450, 85, 449, 84, 448, 83, 447, 82, 446, 81, 445, 80, + 444, 79, 443, 78, 442, 77, 441, 76, 440, 75, 439, 74, 438, 73, 437, + 72, 436, 71, 435, 70, 434, 69, 433, 68, 432, 67, 431, 66, 430, 65, + 429, 64, 428, 63, 427, 62, 426, 61, 425, 60, 424, 59, 423, 58, 422, + 57, 421, 56, 420, 55, 419, 54, 418, 53, 417, 52, 416, 51, 415, 50, + 414, 49, 413, 48, 412, 47, 411, 46, 410, 45, 409, 44, 408, 43, 407, + 42, 406, 41, 405, 40, 404, 39, 403, 38, 402, 37, 401, 36, 400, 35, + 399, 34, 398, 33, 397, 32, 396, 31, 395, 30, 394, 29, 393, 28, 392, + 27, 391, 26, 390, 25, 389, 24, 388, 23, 387, 22, 386, 21, 385, 20, + 384, 19, 383, 18, 382, 17, 381, 16, 380, 15, 379, 14, 378, 13, 377, + 12, 376, 11, 375, 10, 374, 9, 373, 8, 372, 7, 371, 6, 370, 5, + 369, 4, 368, 3, 367, 2, 366, 1, 365, 0}; static void transform128(__m128i *lmid, __m128i *hmid) { - int t1, t2; - __m128i alpha, beta, gamma, delta; - __m128i *lto = lmid + STATE_LENGTH, *hto = hmid + STATE_LENGTH; - __m128i *lfrom = lmid, *hfrom = hmid; - + int t1, t2; + __m128i alpha, beta, gamma, delta; + __m128i *lto = lmid + STATE_LENGTH, *hto = hmid + STATE_LENGTH; + __m128i *lfrom = lmid, *hfrom = hmid; + for (int r = 0; r < 80; r++) { - for (int j = 0; j < STATE_LENGTH; j++) { - t1 = indices[j]; - t2 = indices[j + 1]; - alpha = lfrom[t1]; - beta = hfrom[t1]; - gamma = hfrom[t2]; - delta = (alpha | (~gamma)) & (lfrom[t2] ^ beta); - lto[j] = ~delta; - hto[j] = (alpha ^ gamma) | delta; - } - __m128i *lswap = lfrom, *hswap = hfrom; - lfrom = lto; - hfrom = hto; - lto = lswap; - hto = hswap; - } - for (int j = 0; j < HASH_LENGTH; j++) { - t1 = indices[j]; - t2 = indices[j + 1]; - alpha = lfrom[t1]; - beta = hfrom[t1]; - gamma = hfrom[t2]; - delta = (alpha | (~gamma)) & (lfrom[t2] ^ beta); - lto[j] = ~delta; - hto[j] = (alpha ^ gamma) | delta; - } + for (int j = 0; j < STATE_LENGTH; j++) { + t1 = indices[j]; + t2 = indices[j + 1]; + alpha = lfrom[t1]; + beta = hfrom[t1]; + gamma = hfrom[t2]; + delta = (alpha | (~gamma)) & (lfrom[t2] ^ beta); + lto[j] = ~delta; + hto[j] = (alpha ^ gamma) | delta; + } + __m128i *lswap = lfrom, *hswap = hfrom; + lfrom = lto; + hfrom = hto; + lto = lswap; + hto = hswap; + } + for (int j = 0; j < HASH_LENGTH; j++) { + t1 = indices[j]; + t2 = indices[j + 1]; + alpha = lfrom[t1]; + beta = hfrom[t1]; + gamma = hfrom[t2]; + delta = (alpha | (~gamma)) & (lfrom[t2] ^ beta); + lto[j] = ~delta; + hto[j] = (alpha ^ gamma) | delta; + } } static int incr128(__m128i *mid_low, __m128i *mid_high) { - int i; - __m128i carry; - carry = _mm_set_epi64x(LOW00, LOW01); - - for (i = INCR_START; i < HASH_LENGTH && (i == INCR_START || carry[0]); i++) { - __m128i low = mid_low[i], high = mid_high[i]; - mid_low[i] = high ^ low; - mid_high[i] = low; - carry = high & (~low); - } - return i == HASH_LENGTH; + int i; + __m128i carry; + carry = _mm_set_epi64x(LOW00, LOW01); + + for (i = INCR_START; i < HASH_LENGTH && (i == INCR_START || carry[0]); + i++) { + __m128i low = mid_low[i], high = mid_high[i]; + mid_low[i] = high ^ low; + mid_high[i] = low; + carry = high & (~low); + } + return i == HASH_LENGTH; } static void seri128(__m128i *low, __m128i *high, int n, char *r) { - int index = 0; - + int index = 0; + if (n > 63) { - n -= 64; - index = 1; - } - - for (int i = HASH_LENGTH-NONCE_LENGTH; i < HASH_LENGTH; i++) - { - unsigned long long ll = (low[i][index] >> n) & 1; - unsigned long long hh = (high[i][index] >> n) & 1; - if (hh == 0 && ll == 1) { - r[i + NONCE_LENGTH - HASH_LENGTH] = -1; - } - if (hh == 1 && ll == 1) { - r[i + NONCE_LENGTH - HASH_LENGTH] = 0; - } - if (hh == 1 && ll == 0) { - r[i + NONCE_LENGTH - HASH_LENGTH] = 1; - } - } + n -= 64; + index = 1; + } + + for (int i = HASH_LENGTH - NONCE_LENGTH; i < HASH_LENGTH; i++) { + unsigned long long ll = (low[i][index] >> n) & 1; + unsigned long long hh = (high[i][index] >> n) & 1; + if (hh == 0 && ll == 1) { + r[i + NONCE_LENGTH - HASH_LENGTH] = -1; + } + if (hh == 1 && ll == 1) { + r[i + NONCE_LENGTH - HASH_LENGTH] = 0; + } + if (hh == 1 && ll == 0) { + r[i + NONCE_LENGTH - HASH_LENGTH] = 1; + } + } } static int check128(__m128i *l, __m128i *h, int m) { - __m128i nonce_probe = _mm_set_epi64x(HBITS, HBITS); - + __m128i nonce_probe = _mm_set_epi64x(HBITS, HBITS); + for (int i = HASH_LENGTH - m; i < HASH_LENGTH; i++) { - nonce_probe &= ~(l[i] ^ h[i]); - if (nonce_probe[0] == LBITS && nonce_probe[1] == LBITS) { - return -1; - } - } - for (int j = 0; j < 2; j++) { - for (int i = 0; i < 64; i++) { - if ((nonce_probe[j] >> i) & 1) { - return i + j * 64; - } - } - } - return -2; + nonce_probe &= ~(l[i] ^ h[i]); + if (nonce_probe[0] == LBITS && nonce_probe[1] == LBITS) { + return -1; + } + } + for (int j = 0; j < 2; j++) { + for (int i = 0; i < 64; i++) { + if ((nonce_probe[j] >> i) & 1) { + return i + j * 64; + } + } + } + return -2; } -static long long int loop128(__m128i *lmid, __m128i *hmid, int m, char *nonce, int id) +static long long int loop128(__m128i *lmid, + __m128i *hmid, + int m, + char *nonce, + int id) { - int n = 0; - long long int i = 0; - __m128i lcpy[STATE_LENGTH * 2], hcpy[STATE_LENGTH * 2]; - + int n = 0; + long long int i = 0; + __m128i lcpy[STATE_LENGTH * 2], hcpy[STATE_LENGTH * 2]; + for (i = 0; !incr128(lmid, hmid) && !stopSSE[id]; i++) { for (int j = 0; j < STATE_LENGTH; j++) { lcpy[j] = lmid[j]; @@ -178,55 +232,56 @@ static long long int loop128(__m128i *lmid, __m128i *hmid, int m, char *nonce, i static void para128(char in[], __m128i l[], __m128i h[]) { - for (int i = 0; i < STATE_LENGTH; i++) { - switch (in[i]) { - case 0: - l[i] = _mm_set_epi64x(HBITS, HBITS); - h[i] = _mm_set_epi64x(HBITS, HBITS); - break; - case 1: - l[i] = _mm_set_epi64x(LBITS, LBITS); - h[i] = _mm_set_epi64x(HBITS, HBITS); - break; - case -1: - l[i] = _mm_set_epi64x(HBITS, HBITS); - h[i] = _mm_set_epi64x(LBITS, LBITS); - break; - } - } + for (int i = 0; i < STATE_LENGTH; i++) { + switch (in[i]) { + case 0: + l[i] = _mm_set_epi64x(HBITS, HBITS); + h[i] = _mm_set_epi64x(HBITS, HBITS); + break; + case 1: + l[i] = _mm_set_epi64x(LBITS, LBITS); + h[i] = _mm_set_epi64x(HBITS, HBITS); + break; + case -1: + l[i] = _mm_set_epi64x(HBITS, HBITS); + h[i] = _mm_set_epi64x(LBITS, LBITS); + break; + } + } } -static void incrN128(int n,__m128i *mid_low, __m128i *mid_high) +static void incrN128(int n, __m128i *mid_low, __m128i *mid_high) { - for (int j=0;jindex; - pworkInfo->ret = pwork128(pworkInfo->mid, pworkInfo->mwm, pworkInfo->nonce, pworkInfo->n, task_id); + pworkInfo->ret = pwork128(pworkInfo->mid, pworkInfo->mwm, pworkInfo->nonce, + pworkInfo->n, task_id); pthread_mutex_lock(&pow_sse_mutex[task_id]); if (pworkInfo->ret >= 0) { @@ -256,18 +312,21 @@ static char *tx_to_cstate(Trytes_t *tx) /* Copy tx->data[:(transactionTrinarySize - HashSize) / 3] to tyt */ memcpy(tyt, tx->data, (transactionTrinarySize - HashSize) / 3); - + Trytes_t *inn = initTrytes(tyt, (transactionTrinarySize - HashSize) / 3); - + Absorb(c, inn); Trits_t *tr = trits_from_trytes(tx); char *c_state = (char *) malloc(c->state->len); /* Prepare an array storing tr[transactionTrinarySize - HashSize:] */ - memcpy(c_state, tr->data + transactionTrinarySize - HashSize, tr->len - (transactionTrinarySize - HashSize)); - memcpy(c_state + tr->len - (transactionTrinarySize - HashSize), c->state->data + tr->len - (transactionTrinarySize - HashSize), c->state->len - tr->len + (transactionTrinarySize - HashSize)); - + memcpy(c_state, tr->data + transactionTrinarySize - HashSize, + tr->len - (transactionTrinarySize - HashSize)); + memcpy(c_state + tr->len - (transactionTrinarySize - HashSize), + c->state->data + tr->len - (transactionTrinarySize - HashSize), + c->state->len - tr->len + (transactionTrinarySize - HashSize)); + freeTrobject(inn); freeTrobject(tr); freeCurl(c); @@ -281,10 +340,11 @@ static Trytes_t *nonce_to_result(Trytes_t *tx, Trytes_t *nonce) char *rst = (char *) malloc(rst_len); memcpy(rst, tx->data, tx->len - NonceTrinarySize / 3); - memcpy(rst + tx->len - NonceTrinarySize / 3, nonce->data, rst_len - (tx->len - NonceTrinarySize / 3)); - + memcpy(rst + tx->len - NonceTrinarySize / 3, nonce->data, + rst_len - (tx->len - NonceTrinarySize / 3)); + Trytes_t *ret = initTrytes(rst, rst_len); - + free(rst); return ret; @@ -292,7 +352,8 @@ static Trytes_t *nonce_to_result(Trytes_t *tx, Trytes_t *nonce) void pow_sse_init(int num_task) { - pow_sse_mutex = (pthread_mutex_t *) malloc(sizeof(pthread_mutex_t) * num_task); + pow_sse_mutex = + (pthread_mutex_t *) malloc(sizeof(pthread_mutex_t) * num_task); stopSSE = (int *) malloc(sizeof(int) * num_task); countSSE = (long long int *) malloc(sizeof(long long int) * num_task); @@ -314,19 +375,20 @@ Trytes_t *PowSSE(Trytes_t *trytes, int mwm, int index) { stopSSE[index] = 0; countSSE[index] = 0; - - //Trytes_t *trytes_t = initTrytes(trytes, 2673); + + // Trytes_t *trytes_t = initTrytes(trytes, 2673); Trytes_t *trytes_t = trytes; char *c_state = tx_to_cstate(trytes_t); int num_cpu = DCURL_NUM_CPU; - + pthread_t *threads = (pthread_t *) malloc(sizeof(pthread_t) * num_cpu); - Pwork_struct *pitem = (Pwork_struct *) malloc(sizeof(Pwork_struct) * num_cpu); + Pwork_struct *pitem = + (Pwork_struct *) malloc(sizeof(Pwork_struct) * num_cpu); /* Prepare nonce to each thread */ char **nonce_array = (char **) malloc(sizeof(char *) * num_cpu); - + /* init pthread mutex */ pthread_mutex_init(&pow_sse_mutex[index], NULL); @@ -343,13 +405,14 @@ Trytes_t *PowSSE(Trytes_t *trytes, int mwm, int index) int completedIndex = -1; for (int i = 0; i < num_cpu; i++) { pthread_join(threads[i], NULL); - if (pitem[i].n == -1) completedIndex = i; + if (pitem[i].n == -1) + completedIndex = i; } - - Trits_t *nonce_t = initTrits(nonce_array[completedIndex], NonceTrinarySize); + + Trits_t *nonce_t = initTrits(nonce_array[completedIndex], NonceTrinarySize); Trytes_t *nonce = trytes_from_trits(nonce_t); Trytes_t *last_result = nonce_to_result(trytes_t, nonce); - + free(c_state); for (int i = 0; i < num_cpu; i++) { free(nonce_array[i]); diff --git a/src/pow_sse.h b/src/pow_sse.h index 95566c8..1ec11aa 100644 --- a/src/pow_sse.h +++ b/src/pow_sse.h @@ -26,31 +26,51 @@ void pow_sse_destroy(); #define HBITS 0xFFFFFFFFFFFFFFFFuLL #define LBITS 0x0000000000000000uLL -#define HASH_LENGTH 243 //trits -#define NONCE_LENGTH 81 //trits -#define STATE_LENGTH 3 * HASH_LENGTH //trits -#define TX_LENGTH 2673 //trytes +#define HASH_LENGTH 243 // trits +#define NONCE_LENGTH 81 // trits +#define STATE_LENGTH 3 * HASH_LENGTH // trits +#define TX_LENGTH 2673 // trytes #define INCR_START HASH_LENGTH - NONCE_LENGTH + 4 + 27 -#define LOW00 0xDB6DB6DB6DB6DB6DuLL //0b1101101101101101101101101101101101101101101101101101101101101101L; -#define HIGH00 0xB6DB6DB6DB6DB6DBuLL //0b1011011011011011011011011011011011011011011011011011011011011011L; -#define LOW10 0xF1F8FC7E3F1F8FC7uLL //0b1111000111111000111111000111111000111111000111111000111111000111L; -#define HIGH10 0x8FC7E3F1F8FC7E3FuLL //0b1000111111000111111000111111000111111000111111000111111000111111L; -#define LOW20 0x7FFFE00FFFFC01FFuLL //0b0111111111111111111000000000111111111111111111000000000111111111L; -#define HIGH20 0xFFC01FFFF803FFFFuLL //0b1111111111000000000111111111111111111000000000111111111111111111L; -#define LOW30 0xFFC0000007FFFFFFuLL //0b1111111111000000000000000000000000000111111111111111111111111111L; -#define HIGH30 0x003FFFFFFFFFFFFFuLL //0b0000000000111111111111111111111111111111111111111111111111111111L; -#define LOW40 0xFFFFFFFFFFFFFFFFuLL //0b1111111111111111111111111111111111111111111111111111111111111111L; -#define HIGH40 0xFFFFFFFFFFFFFFFFuLL //0b1111111111111111111111111111111111111111111111111111111111111111L; -#define LOW01 0x6DB6DB6DB6DB6DB6uLL //0b0110110110110110110110110110110110110110110110110110110110110110 -#define HIGH01 0xDB6DB6DB6DB6DB6DuLL //0b1101101101101101101101101101101101101101101101101101101101101101 -#define LOW11 0xF8FC7E3F1F8FC7E3uLL //0b1111100011111100011111100011111100011111100011111100011111100011 -#define HIGH11 0xC7E3F1F8FC7E3F1FuLL //0b1100011111100011111100011111100011111100011111100011111100011111 -#define LOW21 0xC01FFFF803FFFF00uLL //0b1100000000011111111111111111100000000011111111111111111100000000 -#define HIGH21 0x3FFFF007FFFE00FFuLL //0b0011111111111111111100000000011111111111111111100000000011111111 -#define LOW31 0x00000FFFFFFFFFFFuLL //0b0000000000000000000011111111111111111111111111111111111111111111 -#define HIGH31 0xFFFFFFFFFFFE0000uLL //0b1111111111111111111111111111111111111111111111100000000000000000 -#define LOW41 0x000000000001FFFFuLL //0b0000000000000000000000000000000000000000000000011111111111111111 -#define HIGH41 0xFFFFFFFFFFFFFFFFuLL //0b1111111111111111111111111111111111111111111111111111111111111111 +#define LOW00 \ + 0xDB6DB6DB6DB6DB6DuLL // 0b1101101101101101101101101101101101101101101101101101101101101101L; +#define HIGH00 \ + 0xB6DB6DB6DB6DB6DBuLL // 0b1011011011011011011011011011011011011011011011011011011011011011L; +#define LOW10 \ + 0xF1F8FC7E3F1F8FC7uLL // 0b1111000111111000111111000111111000111111000111111000111111000111L; +#define HIGH10 \ + 0x8FC7E3F1F8FC7E3FuLL // 0b1000111111000111111000111111000111111000111111000111111000111111L; +#define LOW20 \ + 0x7FFFE00FFFFC01FFuLL // 0b0111111111111111111000000000111111111111111111000000000111111111L; +#define HIGH20 \ + 0xFFC01FFFF803FFFFuLL // 0b1111111111000000000111111111111111111000000000111111111111111111L; +#define LOW30 \ + 0xFFC0000007FFFFFFuLL // 0b1111111111000000000000000000000000000111111111111111111111111111L; +#define HIGH30 \ + 0x003FFFFFFFFFFFFFuLL // 0b0000000000111111111111111111111111111111111111111111111111111111L; +#define LOW40 \ + 0xFFFFFFFFFFFFFFFFuLL // 0b1111111111111111111111111111111111111111111111111111111111111111L; +#define HIGH40 \ + 0xFFFFFFFFFFFFFFFFuLL // 0b1111111111111111111111111111111111111111111111111111111111111111L; +#define LOW01 \ + 0x6DB6DB6DB6DB6DB6uLL // 0b0110110110110110110110110110110110110110110110110110110110110110 +#define HIGH01 \ + 0xDB6DB6DB6DB6DB6DuLL // 0b1101101101101101101101101101101101101101101101101101101101101101 +#define LOW11 \ + 0xF8FC7E3F1F8FC7E3uLL // 0b1111100011111100011111100011111100011111100011111100011111100011 +#define HIGH11 \ + 0xC7E3F1F8FC7E3F1FuLL // 0b1100011111100011111100011111100011111100011111100011111100011111 +#define LOW21 \ + 0xC01FFFF803FFFF00uLL // 0b1100000000011111111111111111100000000011111111111111111100000000 +#define HIGH21 \ + 0x3FFFF007FFFE00FFuLL // 0b0011111111111111111100000000011111111111111111100000000011111111 +#define LOW31 \ + 0x00000FFFFFFFFFFFuLL // 0b0000000000000000000011111111111111111111111111111111111111111111 +#define HIGH31 \ + 0xFFFFFFFFFFFE0000uLL // 0b1111111111111111111111111111111111111111111111100000000000000000 +#define LOW41 \ + 0x000000000001FFFFuLL // 0b0000000000000000000000000000000000000000000000011111111111111111 +#define HIGH41 \ + 0xFFFFFFFFFFFFFFFFuLL // 0b1111111111111111111111111111111111111111111111111111111111111111 #endif diff --git a/src/trinary/trinary.c b/src/trinary/trinary.c index 3061db5..0b22c70 100644 --- a/src/trinary/trinary.c +++ b/src/trinary/trinary.c @@ -2,28 +2,27 @@ #include "../hash/curl.h" static char TrytesToTritsMappings[][3] = { - {0, 0, 0}, {1, 0, 0}, {-1, 1, 0}, {0, 1, 0}, - {1, 1, 0}, {-1, -1, 1}, {0, -1, 1}, {1, -1, 1}, - {-1, 0, 1}, {0, 0, 1}, {1, 0, 1}, {-1, 1, 1}, - {0, 1, 1}, {1, 1, 1}, {-1, -1, -1}, {0, -1, -1}, - {1, -1, -1}, {-1, 0, -1}, {0, 0, -1}, {1, 0, -1}, - {-1, 1, -1}, {0, 1, -1}, {1, 1, -1}, {-1, -1, 0}, - {0, -1, 0}, {1, -1, 0}, {-1, 0, 0} -}; + {0, 0, 0}, {1, 0, 0}, {-1, 1, 0}, {0, 1, 0}, {1, 1, 0}, {-1, -1, 1}, + {0, -1, 1}, {1, -1, 1}, {-1, 0, 1}, {0, 0, 1}, {1, 0, 1}, {-1, 1, 1}, + {0, 1, 1}, {1, 1, 1}, {-1, -1, -1}, {0, -1, -1}, {1, -1, -1}, {-1, 0, -1}, + {0, 0, -1}, {1, 0, -1}, {-1, 1, -1}, {0, 1, -1}, {1, 1, -1}, {-1, -1, 0}, + {0, -1, 0}, {1, -1, 0}, {-1, 0, 0}}; static char TryteAlphabet[] = "9ABCDEFGHIJKLMNOPQRSTUVWXYZ"; void freeTrobject(Trobject_t *t) { if (t) { - if (t->data) free(t->data); + if (t->data) + free(t->data); free(t); } } static int validateTrits(Trobject_t *trits) { - if (trits->type != TYPE_TRITS) return 0; + if (trits->type != TYPE_TRITS) + return 0; for (int i = 0; i < trits->len; i++) if (trits->data[i] < -1 || trits->data[i] > 1) @@ -33,10 +32,11 @@ static int validateTrits(Trobject_t *trits) static int validateTrytes(Trobject_t *trytes) { - if (trytes->type != TYPE_TRYTES) return 0; + if (trytes->type != TYPE_TRYTES) + return 0; for (int i = 0; i < trytes->len; i++) - if ((trytes->data[i] <= 'A' && trytes->data[i] >= 'Z') && \ + if ((trytes->data[i] <= 'A' && trytes->data[i] >= 'Z') && trytes->data[i] != '9') return 0; return 1; @@ -59,12 +59,12 @@ Trobject_t *initTrits(signed char *src, int len) } /* Copy data from src to Trits */ - memcpy(trits->data, src, len); + memcpy(trits->data, src, len); trits->type = TYPE_TRITS; trits->len = len; trits->data[len] = '\0'; - + /* Check validation */ if (!validateTrits(trits)) { freeTrobject(trits); @@ -116,7 +116,8 @@ Trobject_t *trytes_from_trits(Trobject_t *trits) } if (trits->len % 3 != 0 || !validateTrits(trits)) { - printf("trinary.c: trytes_from_trits: Not available trits to convert\n"); + printf( + "trinary.c: trytes_from_trits: Not available trits to convert\n"); exit(1); } @@ -125,11 +126,11 @@ Trobject_t *trytes_from_trits(Trobject_t *trits) /* Start converting */ for (int i = 0; i < trits->len / 3; i++) { - int j = trits->data[i * 3] + \ - trits->data[i * 3 + 1] * 3 + \ + int j = trits->data[i * 3] + trits->data[i * 3 + 1] * 3 + trits->data[i * 3 + 2] * 9; - - if (j < 0) j += 27; + + if (j < 0) + j += 27; src[i] = TryteAlphabet[j]; } @@ -147,7 +148,9 @@ Trobject_t *trits_from_trytes(Trobject_t *trytes) } if (!validateTrytes(trytes)) { - printf("trinary.c: trits_from_trytes: trytes is not available to convert\n"); + printf( + "trinary.c: trits_from_trytes: trytes is not available to " + "convert\n"); exit(1); } @@ -185,7 +188,8 @@ Trobject_t *hashTrytes(Trobject_t *t) int compareTrobject(Trobject_t *a, Trobject_t *b) { - if (a->type != b->type || a->len != b->len) return 0; + if (a->type != b->type || a->len != b->len) + return 0; for (int i = 0; i < a->len; i++) if (a->data[i] != b->data[i]) diff --git a/test/test_curl.c b/test/test_curl.c index 3789de7..ab099ce 100644 --- a/test/test_curl.c +++ b/test/test_curl.c @@ -5,13 +5,53 @@ int main() { - const char *trytes_test_case = "QQ9VLGQTJICJH9UZNSBXRSKBWVXCTRNGLJPEYFSZBISDCGBHGAV9TEHIMJS9LMQNHFNWVAXALKGESPWZMUMZPQCKCUFSEJZVHWZHZOEZBPTERXPHUQLQLZMENKOKAWMJ9LCFSIBSBEYCJQVQQMTMRJMDEKRXLCIRZFWQBRJYLPSK9XLWFYFTU9FBJATWPQRJBHWYJRUEXSXMBJLVWNYRTZJTHLEKDTWCGJ9OXDEZNWTKLTXXTKVFXDMRJUDAMDACRHJKZIJFJBZRVDLSTIMOWPTLLIVHCFUBMSQIPVPCSQAPZGHHNNQLWEHDTIQZQTAXJMTTROYOTIZSZKKQFXBHXFKSNAGZWHWEGXCKHSJQGBJGC9IKUSSJEAOHTPGPMIYPEXJXJKRLX9IOCUDKK9ONEUONYVGHRHXSAUZJXGVQNWSDZIYXXZMMJKRTOXSWJHBIMXPEMJTKIBSQKPICTKAQLJVOLZSGNVVBIOFJJKKJ9UBYKJWCBRPQLGBNEKEFRYCHB9PORAKEKTJZYZBFGZLONUJCPNINGUTYWTMDKTEPDASCHNVHXTUIOZ9PDALXKQYLILMUJEJWTYYAGEQXNNPLOMFGHSTFCNRMDFUSQREHFASDXZZOYNWNVKCRFZIDF9X9YKME9O9NJH9LFVNNSOXHSQOMBULFHBBPSGRCCGKWENQOZHRSIIHKKXAQTFISNVGIVMBDKSJYDW9VTZBAVYWWJAIYSCHGBIXKMKHBRTHWQMIWQVPWFUJQVUDZRDX9MMCXOQTQZGKECGIHATHUC9TDGKUKOYXEEBGTQYEO9KADOSMYWGQARTIUG9IUHQEBWSFHWDZCRCH9WDRJEUSQDBBGGKTOYBKYZX9LUKUGBVTEPXDOVVNSKPUWNARSILQNOQKATCUHMRVMKVHF9B9TEJDOMBDXLNKDJI9IIYRXNOQPBOVOEEGQFSZJJOFPNFVXOYZNLSOOA9FWDFJKDOQUHWHBNDWQZZVRBZJSLDVBRCGFCWXNUFTMLCHNXODSQMUIBPN9NMAXZXKUYYRUEDSLW9UEQYGSEBEOHGI9W9WAUFDEQCXVYOTBAAHFXHRGJBWGFZKIUMSWEXAD9EDALOOYQZIXKUOWJDHBHSEUDPJJRXANPPHUZWJM9KDVGJUAQHFJTWNFSULGSWMGMAOCAHTIYYJONOLKGNKRXWWZYWKITSFPQJNHQWAIJULYWPXQENPZTWZISXJBWYLENOINLFBRWWGWSWJONHIA99VGCSAT9XNMZUCSVEJMZJASUSXVUWFSVFXUIFWGIFKLEFLANHTITFCOPXRXTDXRDHLWP9RJHVQJMLPBFVHTIOQMSZECNPITTBTPLUHDQQZP9BWTWIZSOTMTZQWHCETRTKQPOHPJMJMLSBWC9ZRQAZDLAPJHAXRQZ9RUHHBPASWVUHBYX9FH9PLEHQEKCOMIHUNDVKOPKXEFM9CNP9LOLMBVHMMWNDCKHSYZEXOJAQOHMRXEGWMWFW9YVOZ9YDPHWVTKWFYUECSROYJENFPSIKHBJRSNWO9KQUENGPVULVYAQFAIYFSNIYR9LLRMYNCNQQAOPFNMWFSWSPMWNNIRNVKDZWRLGMPCBOVIMMXEZUFYPFPIGWTGOLDAEBZQADSOGVDZXHEWZGHNAAHMFPSOZD9SEPNCW9GTN9WLFDDCKMMXPXAEUUJPJFKKWMGUKVMYBH9AIEFAIIDJOAWRDKECA99XOYRSFZQKTVRJMTUAQJZUTKGXROESUYYSHTLRIZRPSNDFEEZWXCQONZYCD9TOHCBP9ISXQ9YSRZJ999Z9TETYOINSDGRBQSDTVFABHQNLTWGFYLHBHPVKLIBUMLVSURAOS9QHXDTIPKOJDLYOKRCEKCBMKVYIAKVA9WTGDWHIRUAWOVRKOSYTNIZAZNTJRFJDMNLGHTDKPKZDLBPQXRIRIVREMOBCPHMBBAUKNXHU9XIZNG9GD9LDIBBFPSI9PJNRCHXHNWAZXIACE9LUBNUWOK9LGJ9MKZQRI9CBCJUNALQKKVGGSPRJFAGCXNFO99YMLMKI9NVUZCZ9BCUEBSGMAVNKGWYWWQPZISMKAROXLQWEHOJIJOIIYRUDBNHRD9DEDQWQONAXKKSYMYCFTITZFKIXKZCGAVAFQIYEMESOIMWUUDSXJRR9RVWTAAHCOA9SCQBF9LAGPPYDXPEBKLHZ9KHKTXFP9XOVMVWIXEWMOISJHMQEXMYMZCUGEQNKGUNVRPUDPRX9IR9LBASIARWNFXXESPITSLYAQMLCLVTLHW9999999999999999999999999999999999999999999999999999FBIEUWD99A99999999C99999999DEXRPLKGBROUQMKCLMRPG9HFKCACDZ9AB9HOJQWERTYWERJNOYLW9PKLOGDUPC9DLGSUH9UHSKJOASJRU9MMRRSLICRITOROFC9FBVWLFEDNN9KJKYHUMRCJEUDGCYCWTBP9HHBEEJRFAU9FALRJWTU99NZK999999UE9VSBDVSRNTBZWPXYZPGAUTSWFLARLPXMHYBSTEUWIDOFJQJMVIACGUPTOMBWQO9AEADCFCMFJ999999WQKHJEXIHMOKQETOUTEO9JUPCDNAJQYZVXQRCXGYGEBOTMHE9HSJXVYVQUS9FPDLQWWKSYVDPCXX9LLAT"; + const char *trytes_test_case = + "QQ9VLGQTJICJH9UZNSBXRSKBWVXCTRNGLJPEYFSZBISDCGBHGAV9TEHIMJS9LMQNHFNWVA" + "XALKGESPWZMUMZPQCKCUFSEJZVHWZHZOEZBPTERXPHUQLQLZMENKOKAWMJ9LCFSIBSBEYC" + "JQVQQMTMRJMDEKRXLCIRZFWQBRJYLPSK9XLWFYFTU9FBJATWPQRJBHWYJRUEXSXMBJLVWN" + "YRTZJTHLEKDTWCGJ9OXDEZNWTKLTXXTKVFXDMRJUDAMDACRHJKZIJFJBZRVDLSTIMOWPTL" + "LIVHCFUBMSQIPVPCSQAPZGHHNNQLWEHDTIQZQTAXJMTTROYOTIZSZKKQFXBHXFKSNAGZWH" + "WEGXCKHSJQGBJGC9IKUSSJEAOHTPGPMIYPEXJXJKRLX9IOCUDKK9ONEUONYVGHRHXSAUZJ" + "XGVQNWSDZIYXXZMMJKRTOXSWJHBIMXPEMJTKIBSQKPICTKAQLJVOLZSGNVVBIOFJJKKJ9U" + "BYKJWCBRPQLGBNEKEFRYCHB9PORAKEKTJZYZBFGZLONUJCPNINGUTYWTMDKTEPDASCHNVH" + "XTUIOZ9PDALXKQYLILMUJEJWTYYAGEQXNNPLOMFGHSTFCNRMDFUSQREHFASDXZZOYNWNVK" + "CRFZIDF9X9YKME9O9NJH9LFVNNSOXHSQOMBULFHBBPSGRCCGKWENQOZHRSIIHKKXAQTFIS" + "NVGIVMBDKSJYDW9VTZBAVYWWJAIYSCHGBIXKMKHBRTHWQMIWQVPWFUJQVUDZRDX9MMCXOQ" + "TQZGKECGIHATHUC9TDGKUKOYXEEBGTQYEO9KADOSMYWGQARTIUG9IUHQEBWSFHWDZCRCH9" + "WDRJEUSQDBBGGKTOYBKYZX9LUKUGBVTEPXDOVVNSKPUWNARSILQNOQKATCUHMRVMKVHF9B" + "9TEJDOMBDXLNKDJI9IIYRXNOQPBOVOEEGQFSZJJOFPNFVXOYZNLSOOA9FWDFJKDOQUHWHB" + "NDWQZZVRBZJSLDVBRCGFCWXNUFTMLCHNXODSQMUIBPN9NMAXZXKUYYRUEDSLW9UEQYGSEB" + "EOHGI9W9WAUFDEQCXVYOTBAAHFXHRGJBWGFZKIUMSWEXAD9EDALOOYQZIXKUOWJDHBHSEU" + "DPJJRXANPPHUZWJM9KDVGJUAQHFJTWNFSULGSWMGMAOCAHTIYYJONOLKGNKRXWWZYWKITS" + "FPQJNHQWAIJULYWPXQENPZTWZISXJBWYLENOINLFBRWWGWSWJONHIA99VGCSAT9XNMZUCS" + "VEJMZJASUSXVUWFSVFXUIFWGIFKLEFLANHTITFCOPXRXTDXRDHLWP9RJHVQJMLPBFVHTIO" + "QMSZECNPITTBTPLUHDQQZP9BWTWIZSOTMTZQWHCETRTKQPOHPJMJMLSBWC9ZRQAZDLAPJH" + "AXRQZ9RUHHBPASWVUHBYX9FH9PLEHQEKCOMIHUNDVKOPKXEFM9CNP9LOLMBVHMMWNDCKHS" + "YZEXOJAQOHMRXEGWMWFW9YVOZ9YDPHWVTKWFYUECSROYJENFPSIKHBJRSNWO9KQUENGPVU" + "LVYAQFAIYFSNIYR9LLRMYNCNQQAOPFNMWFSWSPMWNNIRNVKDZWRLGMPCBOVIMMXEZUFYPF" + "PIGWTGOLDAEBZQADSOGVDZXHEWZGHNAAHMFPSOZD9SEPNCW9GTN9WLFDDCKMMXPXAEUUJP" + "JFKKWMGUKVMYBH9AIEFAIIDJOAWRDKECA99XOYRSFZQKTVRJMTUAQJZUTKGXROESUYYSHT" + "LRIZRPSNDFEEZWXCQONZYCD9TOHCBP9ISXQ9YSRZJ999Z9TETYOINSDGRBQSDTVFABHQNL" + "TWGFYLHBHPVKLIBUMLVSURAOS9QHXDTIPKOJDLYOKRCEKCBMKVYIAKVA9WTGDWHIRUAWOV" + "RKOSYTNIZAZNTJRFJDMNLGHTDKPKZDLBPQXRIRIVREMOBCPHMBBAUKNXHU9XIZNG9GD9LD" + "IBBFPSI9PJNRCHXHNWAZXIACE9LUBNUWOK9LGJ9MKZQRI9CBCJUNALQKKVGGSPRJFAGCXN" + "FO99YMLMKI9NVUZCZ9BCUEBSGMAVNKGWYWWQPZISMKAROXLQWEHOJIJOIIYRUDBNHRD9DE" + "DQWQONAXKKSYMYCFTITZFKIXKZCGAVAFQIYEMESOIMWUUDSXJRR9RVWTAAHCOA9SCQBF9L" + "AGPPYDXPEBKLHZ9KHKTXFP9XOVMVWIXEWMOISJHMQEXMYMZCUGEQNKGUNVRPUDPRX9IR9L" + "BASIARWNFXXESPITSLYAQMLCLVTLHW9999999999999999999999999999999999999999" + "999999999999FBIEUWD99A99999999C99999999DEXRPLKGBROUQMKCLMRPG9HFKCACDZ9" + "AB9HOJQWERTYWERJNOYLW9PKLOGDUPC9DLGSUH9UHSKJOASJRU9MMRRSLICRITOROFC9FB" + "VWLFEDNN9KJKYHUMRCJEUDGCYCWTBP9HHBEEJRFAU9FALRJWTU99NZK999999UE9VSBDVS" + "RNTBZWPXYZPGAUTSWFLARLPXMHYBSTEUWIDOFJQJMVIACGUPTOMBWQO9AEADCFCMFJ9999" + "99WQKHJEXIHMOKQETOUTEO9JUPCDNAJQYZVXQRCXGYGEBOTMHE9HSJXVYVQUS9FPDLQWWK" + "SYVDPCXX9LLAT"; int length_test_case = 2673; - + Trytes_t *answer = initTrytes((signed char *) "WPM9JCTQH9QHBHBJCODWDNPSLFLQDZADRAEZTZDL9OEGTVRZARVLVJHZIMPBPCTAIYJKWTUSRKNNTMFOQ", 81); - Trytes_t *trytes = initTrytes((signed char *) trytes_test_case, length_test_case); + Trytes_t *trytes = + initTrytes((signed char *) trytes_test_case, length_test_case); Trytes_t *ret_trytes = hashTrytes(trytes); - + int ret = compareTrobject(ret_trytes, answer); freeTrobject(answer); @@ -22,7 +62,7 @@ int main() printf("Curl Test Failed!\n"); return -1; } - + printf("Curl Test Passed!\n"); return 0; } diff --git a/test/test_pow_cl.c b/test/test_pow_cl.c index 5ad00a5..2fee7d6 100644 --- a/test/test_pow_cl.c +++ b/test/test_pow_cl.c @@ -1,12 +1,51 @@ /* Test program for pow_sse & pow_cl */ #include -#include "../src/trinary/trinary.h" #include "../src/pow_cl.h" +#include "../src/trinary/trinary.h" int main() { - char *txt = "999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999A9RGRKVGWMWMKOLVMDFWJUHNUNYWZTJADGGPZGXNLERLXYWJE9WQHWWBMCPZMVVMJUMWWBLZLNMLDCGDJ999999999999999999999999999999999999999999999999999999YGYQIVD99999999999999999999TXEFLKNPJRBYZPORHZU9CEMFIFVVQBUSTDGSJCZMBTZCDTTJVUFPTCCVHHORPMGCURKTH9VGJIXUQJVHK999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"; - + char *txt = + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "99999999999999999A9RGRKVGWMWMKOLVMDFWJUHNUNYWZTJADGGPZGXNLERLXYWJE9WQH" + "WWBMCPZMVVMJUMWWBLZLNMLDCGDJ999999999999999999999999999999999999999999" + "999999999999YGYQIVD99999999999999999999TXEFLKNPJRBYZPORHZU9CEMFIFVVQBU" + "STDGSJCZMBTZCDTTJVUFPTCCVHHORPMGCURKTH9VGJIXUQJVHK99999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999"; + Trytes_t *trytes = initTrytes((signed char *) txt, 2673); int mwm = 14; diff --git a/test/test_pow_sse.c b/test/test_pow_sse.c index d6a8879..30f109d 100644 --- a/test/test_pow_sse.c +++ b/test/test_pow_sse.c @@ -1,19 +1,58 @@ /* Test program for pow_sse & pow_cl */ #include -#include "../src/trinary/trinary.h" #include "../src/pow_sse.h" +#include "../src/trinary/trinary.h" int main() { - char *txt = "999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999A9RGRKVGWMWMKOLVMDFWJUHNUNYWZTJADGGPZGXNLERLXYWJE9WQHWWBMCPZMVVMJUMWWBLZLNMLDCGDJ999999999999999999999999999999999999999999999999999999YGYQIVD99999999999999999999TXEFLKNPJRBYZPORHZU9CEMFIFVVQBUSTDGSJCZMBTZCDTTJVUFPTCCVHHORPMGCURKTH9VGJIXUQJVHK999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999"; - + char *txt = + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "99999999999999999A9RGRKVGWMWMKOLVMDFWJUHNUNYWZTJADGGPZGXNLERLXYWJE9WQH" + "WWBMCPZMVVMJUMWWBLZLNMLDCGDJ999999999999999999999999999999999999999999" + "999999999999YGYQIVD99999999999999999999TXEFLKNPJRBYZPORHZU9CEMFIFVVQBU" + "STDGSJCZMBTZCDTTJVUFPTCCVHHORPMGCURKTH9VGJIXUQJVHK99999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999999999999999999999999999999999999999999999999999999999999" + "9999999999999"; + Trytes_t *trytes = initTrytes((signed char *) txt, 2673); int mwm = 14; printf("Testing SSE Implementation with mwm = %d...\n", mwm); pow_sse_init(1); Trytes_t *ret_trytes = PowSSE(trytes, mwm, 0); - pow_sse_destroy(); + pow_sse_destroy(); Trytes_t *hash_trytes = hashTrytes(ret_trytes); printf("Result: %s\n", hash_trytes->data); diff --git a/test/test_trinary.c b/test/test_trinary.c index 892d378..a6ff818 100644 --- a/test/test_trinary.c +++ b/test/test_trinary.c @@ -4,10 +4,13 @@ int main() { - char *trytes_test_case = "SCYLJDWIM9LIXCSLETSHLQOOFDKYOVFZLAHQYCCNMYHRTNIKBZRIRACFYPOWYNSOWDNXFZUG9OEOZPOTD"; + char *trytes_test_case = + "SCYLJDWIM9LIXCSLETSHLQOOFDKYOVFZLAHQYCCNMYHRTNIKBZRIRACFYPOWYNSOWDNXFZ" + "UG9OEOZPOTD"; int length_test_case = 81; - Trytes_t *trytes = initTrytes((signed char *) trytes_test_case, length_test_case); + Trytes_t *trytes = + initTrytes((signed char *) trytes_test_case, length_test_case); Trits_t *trits = trits_from_trytes(trytes); Trytes_t *ret_trytes = trytes_from_trits(trits);